mysql事务

事务的隔离级别

╄→尐↘猪︶ㄣ 提交于 2019-11-27 15:57:05
一、在多事务在在相近的时间由多人处理时,此时往往存在一系列并发问题: 1、 脏读(Drity Read) 已知有两个事务 A 和 B, A 读取了已经被 B 更新但还没有被提交的数据,之后, B 回滚事务, A 读取的数据就是脏数据 2、 不可重复读(Non-repeatable read) 已知有两个事务A 和 B , A 多次读取同一数据, B 在 A 多次读取的过程中对数据作了 修改 并提交,导致 A 多次读取同一数据时,结果不一致 3、 幻读(Phantom Read) 已知有两个事务A 和 B , A 从一个表中读取了数据,然后 B 在该表中 插入 了一些新数据,导致 A 再次读取同一个表 , 就会多出几行,简单地说,一个事务中先后读取一个范围的记录,但每次读取的纪录数不同,称之为幻象读 注:不可重复读与幻读 区别就是在读取数据是另一方对数据尽行了何种修改: 修改 和 插入 二、处理方法: 事务隔离权限 根据实际需求,通过设置数据库的事务隔离级别可以解决多个事务并发情况下出现的脏读、不可重复读和幻读问题,数据库事务隔离级别由低到高依次为 Read uncommitted、Read committed、Repeatable read和Serializable 等四种。数据库不同,其支持的事务隔离级别亦不相同: MySQL数据库支持上面四种事务隔离级别

事务隔离机制原理分析以及是否可以防止订单超卖

廉价感情. 提交于 2019-11-27 14:22:33
事务的隔离机制是指: Read Uncommitted(读取未提交内容) Read Committed(读取提交内容) Repeatable Read(可重读) Serializable(可串行化) 具体的解释最经典的MySQL书《高性能MySQL(第3版)》已经有了就不在其他地方再引用了: 隔离机制的比较 其实也有人喜欢用锁来控制并发,书中还提到了“隐式”和“显示锁定”,是这么建议的: 虽然这样,但是其实如果不经过实际的演练还是很难理解上面说的事务隔离机制到底怎么样可以防止并发。 1.查看MySQL版本 我们的版本是5.1.7 2.查看存储引擎 >show engines; 存储引擎是:InnoDB 3.实验表 假设有个商品表g,关键字段num表示 库存 ,name表示商品名称 主要就是看不同事务隔离机制下并发修改库存是否会出现超卖。 假设我们的程序需要先查询库存,如果库存>0都可以卖,update扣库存,否则rollback。 为了制造并发肯定需要2个事务,假设是A和B。 4.确认事务隔离机制 修改会话的事务隔离级别 set session transaction isolation level read uncommitted; set session transaction isolation level read committed; set session

【MySQL】存储引擎 -- 2019-08-17 02:28:42

放肆的年华 提交于 2019-11-27 14:21:16
原文: http://blog.gqylpy.com/gqy/245 " 目录 #. MySQL支持的存储引擎 1. InnoDB 2. MyISAM 3. NDB 4. Memory 5. Infobright 6. NTSE 7. BLACKHOLE MySQL中的库即文件夹,表即文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制.(如:处理文本用txt类型,处理表格用excel, 处理图片 用png等) 数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎. PS:存储引擎说白了就是如何存储数据,如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库 中数据 的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型) 在Oracle和SQL Server等数据库中只有一种存储引擎,所有数据库存储管理机制都是一样的,而MySQL数据库提供了多种存储引擎,用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。 ![在这里插入图片描述](http://blog.gqylpy.com/media/ai/2019-03/f065e887-be54-4608-a236-c400c1478427.png) SQL解释器

【MySQL】存储引擎 -- 2019-08-17 02:21:30

徘徊边缘 提交于 2019-11-27 14:20:21
原文: http://blog.gqylpy.com/gqy/245 " 目录 #. MySQL支持的存储引擎 1. InnoDB 2. MyISAM 3. NDB 4. Memory 5. Infobright 6. NTSE 7. BLACKHOLE MySQL中的库即文件夹,表即文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制.(如:处理文本用txt类型,处理表格用excel, 处理图片 用png等) 数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎. PS:存储引擎说白了就是如何存储数据,如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库 中数据 的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型) 在Oracle和SQL Server等数据库中只有一种存储引擎,所有数据库存储管理机制都是一样的,而MySQL数据库提供了多种存储引擎,用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。 ![在这里插入图片描述](http://blog.gqylpy.com/media/ai/2019-03/f065e887-be54-4608-a236-c400c1478427.png) SQL解释器

spring基于XML的声明式事务控制

杀马特。学长 韩版系。学妹 提交于 2019-11-27 14:09:21
<?xml version="1.0" encoding="utf-8" ?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop

spring注解-声明式事务

我怕爱的太早我们不能终老 提交于 2019-11-27 14:08:13
实现步骤: 1.导入依赖包:数据源 c3p0 , 数据库驱动:mysql-connector-java , spring事务包:这时导入spring-jdbc,该包依赖spring-tx, maven会自动导入依赖 <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> 2.@EnableTransactionManagement开启事务管理器 3.@Transactional标在方法上

事务的隔离性分析

守給你的承諾、 提交于 2019-11-27 14:07:57
关键字:隔离性、幻读、间隙锁 1、并发的事务之间是互不干扰的,它们之间是隔离进行。这是事务的隔离性的体现。 2、事务的四种隔离级别&&三种问题: (1)四种隔离级别:读未提交、读提交、可重复读、串行化 (2)三种问题: 脏读、不可重复读、幻读 详细分析: http://blog.sina.com.cn/s/blog_499740cb0100ugs7.html 3、对比分析: (1)可重复读&&不可重复读:   可重复读 :指的是一个事务可以读取其他事务的更新,但是第一次读取到的数据,就算下次读取别的事务时,该事务已经对这个数据进行更新了,当前事务还是保持第一次读取的那个数据,也就可以抽象认为可以重复读到相同的数据。在这个隔离级别之下,只有当前事务提交之后,才能够读取到其他事务的提交。(冲突就发生在这个时刻)   不可重复读 :指的是数据不可重复读,别的事务一旦更新了这个数据,那么当前事务也需要更新这个数据,不可以再读到之前的那个数据。在同一个事务中,两次读取的数据不一致。 对比:   ①可重复读时隔离级别; 不可重复读是一种现象;   ②对于可重复读:当前事务未提交时,不可以读取到其他事务的commit,只能重复读取第一次读取的commit的内容;    对于不可重复读:当前事务未提交时,可以读取到其他事务的commit,每次都是读取到别的事务最新提交的内容; (2

第一次有人把“分布式事务”讲的这么简单明了

随声附和 提交于 2019-11-27 13:12:39
不知道你是否遇到过这样的情况,去小卖铺买东西,付了钱,但是店主因为处理了一些其他事,居然忘记你付了钱,又叫你重新付 又或者在网上购物明明已经扣款,但是却告诉我没有发生交易。这一系列情况都是因为没有事务导致的。这说明了事务在生活中的一些重要性。 有了事务,你去小卖铺买东西,那就是一手交钱一手交货。有了事务,你去网上购物,扣款即产生订单交易。 事务的具体定义 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元,组成事务的所有操作只有在所有操作均能正常执行的情况下方能提交,只要其中任一操作执行失败,都将导致整个事务的回滚。 简单地说,事务提供一种“要么什么都不做,要么做全套(All or Nothing)”机制。 数据库本地事务 ACID 说到数据库事务就不得不说,数据库事务中的四大特性 ACID: A:原子性(Atomicity),一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。 事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 就像你买东西要么交钱收货一起都执行,要么发不出货,就退钱。 C:一致性(Consistency),事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。 如果事务成功地完成,那么系统中所有变化将正确地应用

分布式事务实践笔记

我的未来我决定 提交于 2019-11-27 13:10:21
微服务系统 事务 事务的原则 事务:是一种可靠,一致的方式,访问和操作数据库中数据的程序单元 原则特性: 原子性, 一致性 ,隔离性:事务之间互不干扰,持久性: 没提交事务之前,系统挂了,数据还是之前的数据,并没有被改变 mysql 查询事务的隔离级别 SELECT @@GLOBAL.tx_isolation,@@tx_isolation; 默认是 REPEATABLE-READ 可重复读 什么是 可重复读? 比如 开启一个 事务,这个事务只读某一个表的 某条 的取数据。 但是这时候并没有提交 , 但是 这时候另一个事务 修改了 该条数据,并提交了事务。 此时 之前的 的那个为 提交的事务,再次查询数据,这时候的数据是 未改变之前的数据,并不会因为 其他事务修改了数据提交了事务, 而显示出来 修改的值。 mysql 可重复读 修复 因为mysql 的事务隔离级别是 可重复读,另一个事务a 在执行更新数据,但是未提交, 这时候 一个事务 读取到 值之后, 另一个事务a更新了数据, 那么这时候 之前读取的值就不对了,怎么解决呢? 1, 要么改 数据隔离级别是 序列化的, 可以修改当前 连接 session的 事务隔离级别 2. 使用 FOR UPDATE 这时候 比如 SELECT * FROM T_USER FOR UPDATE 此时 如果该表有未 提交事务,将等待 事务提交完成

mysql事务回滚机制概述

烂漫一生 提交于 2019-11-27 13:06:34
应用场景: 银行取钱,从ATM机取钱,分为以下几个步骤 1 登陆ATM机,输入密码; 2 连接数据库,验证密码; 3 验证成功,获得用户信息,比如存款余额等; 4 用户输入需要取款的金额,按下确认键; 5 从后台数据库中减掉用户账户上的对应金额; 6 ATM吐出钱; 7 用户把钱拿走。 对于上面的取钱这个事情,如果有一步出现错误的话,那么就会取消整个取钱的动作,但是如果在第5步,系统后台已经把钱减了,但是ATM机没有取出来,那么就应用到mysql中的事务。简单地 来说,就是取钱这7步要么都完成,要么就啥也不做,在数据库中就是这个道理。 事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销,在事务中,每个正确的原子 操作都会被顺序执行,直到遇到错误的原子操作。回滚的意思其实即使如果之前是插入操作的话,那么会执行删除之前插入的记录,如果是修改操作的话,那么会执行将update之前的记录还原。 因此,正确的原子操作是真正被执行过的,是物理执行。 事务是由一条或者多条sql语句组成,在事务的操作中,要么这些sql语句都执行,要么都不执行。 事务的ACID特性:原子性,一致性,隔离性,持久性。 在当前事务中确实能看到插入的记录,最后只不过被删除了,但是auto_increament不会删除而是改变值