隔离级别

MySQL的事务隔离级别

ぐ巨炮叔叔 提交于 2019-11-26 16:43:24
事务的概念   事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有SQL语句均执行成功,则事物被顺利执行。 事务的四个属性 1、原子性:事务是由一个或一组相互关联的SQL语句组成,这些语句被认为是一个不可分割的单元,要么都成功要么全回滚。 2、一致性:对于数据库的修改是一致的,即多个用户查的的数据是一样的。一致性主要由mysql的日志机制处理,他记录数据的变化,为事务恢复提供跟踪记录。 3、隔离性:每个事务都有自己的空间,和其他发生在系统中的事务隔离开来,而且事务的结果只在他完全被执行时才能看到 4、持久性:但提交了这个事务之后对数据的修改更新就是永久的。当一个事务完成,数据库的日志已经被更新时,持久性即可发挥其特有的 功效,在mysql中,如果系统崩溃或者数据存储介质被破坏,通过日志,系统能够恢复在重启前进行的最后一次成功更新,可以反应系统崩溃时处于执行过程的事物的变化。 事务的隔离级别 1、读未提交(脏读)READ UNCOMMITTED   A事务读取到了B事务未提交的数据,脏读 2、读已提交(不可重复度)READ COMMITTED   A事务读取B事务提交的事务

MySQL中一条SQL的加锁分析

依然范特西╮ 提交于 2019-11-26 16:26:55
MySQL中一条SQL的加锁分析 id主键 + RC id唯一索引 + RC id非唯一索引 + RC id无索引 + RC id主键 + RR id唯一索引 + RR id非唯一索引 + RR id无索引 + RR Serializable 一条复杂的SQL 死锁原理与分析 SQL1: select * from t1 where id = 10;(不加锁。因为MySQL是使用多版本并发控制的,读不加锁。) SQL2: delete from t1 where id = 10;(需根据多种情况进行分析) 假设t1表上有索引,执行计划一定会选择使用索引进行过滤 (索引扫描),根据以下组合,来进行分析。 组合一 : id列是主键,RC隔离级别 组合二 : id列是二级唯一索引,RC隔离级别 组合三 : id列是二级非唯一索引,RC隔离级别 组合四 : id列上没有索引,RC隔离级别 组合五 : id列是主键,RR隔离级别 组合六 : id列是二级唯一索引,RR隔离级别 组合七 : id列是二级非唯一索引,RR隔离级别 组合八 : id列上没有索引,RR隔离级别 组合九 : Serializable隔离级别 注:在前面八种组合下,也就是RC,RR隔离级别下,SQL1:select操作均不加锁,采用的是快照读,因此在下面的讨论中就忽略了,主要讨论SQL2:delete操作的加锁。 1.

惊!史上最全的select加锁分析(Mysql)

狂风中的少年 提交于 2019-11-26 16:12:06
引言 大家在面试中有没遇到面试官问你下面六句Sql的区别呢 select * from table where id = ? select * from table where id < ? select * from table where id = ? lock in share mode select * from table where id < ? lock in share mode select * from table where id = ? for update select * from table where id < ? for update 如果你能清楚的说出,这六句sql在不同的事务隔离级别下,是否加锁,加的是共享锁还是排他锁,是否存在间隙锁,那这篇文章就没有看的意义了。 之所以写这篇文章是因为目前为止网上这方面的文章太片面,都只说了一半,且大多没指明隔离级别,以及 where 后跟的是否为索引条件列。在此,我就不一一列举那些有误的文章了,大家可以自行百度一下,大多都是讲不清楚。 OK,要回答这个问题,先问自己三个问题 当前事务隔离级别是什么 id列是否存在索引 如果存在索引是聚簇索引还是非聚簇索引呢? OK,开始回答 正文 innodb一定存在聚簇索引,默认以主键作为聚簇索引 有几个索引,就有几棵B+树(不考虑hash索引的情形)

数据库事务的隔离级别和传播行为

核能气质少年 提交于 2019-11-26 14:11:49
事务的性质: ACID A:原子性 C:一致性 I:隔离性 D:持久性 隔离级别: Read Uncommitted(未提交读):可读取其他事务未提交的数据,脏读、幻读、不可重复读 Read Committed(已提交读),只能读取其他事务已提交的数据,解决脏读 Repeatable read(可重复读),在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交,解决脏读,不可重复读 Serializable(串行化) 注意:不可重复读和幻读的区别在于,幻读的重点在于insert,而不可重复读的重点在于update和delete 避免不可重复读需要锁行就行 避免幻影读则需要锁表 如果使用锁机制来实现这两种隔离级别,在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复 读了。但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会 发现莫名其妙多了一条之前没有的数据,这就是幻读,不能通过行锁来避免。需要Serializable隔离级别 ,读用读锁,写用写锁,读锁和写锁互斥,这么做可以有效的避免幻读、不可重复读、脏读等问题,但会极大的降低数据库的并发能力。 传播行为 Required: 支持事物

【转】史上最全的select加锁分析(Mysql)

我只是一个虾纸丫 提交于 2019-11-26 12:28:46
引言 大家在面试中有没遇到面试官问你下面六句Sql的区别呢 select * from table where id = ? select * from table where id < ? select * from table where id = ? lock in share mode select * from table where id < ? lock in share mode select * from table where id = ? for update select * from table where id < ? for update 如果你能清楚的说出,这六句sql在不同的事务隔离级别下,是否加锁,加的是共享锁还是排他锁,是否存在间隙锁,那这篇文章就没有看的意义了。 之所以写这篇文章是因为目前为止网上这方面的文章太片面,都只说了一半,且大多没指明隔离级别,以及 where 后跟的是否为索引条件列。在此,我就不一一列举那些有误的文章了,大家可以自行百度一下,大多都是讲不清楚。 OK,要回答这个问题,先问自己三个问题 当前事务隔离级别是什么 id列是否存在索引 如果存在索引是聚簇索引还是非聚簇索引呢? OK,开始回答 正文 本文假定读者,看过我的 《MySQL(Innodb)索引的原理》 。如果没看过,额,你记得三句话吧 innodb一定存在聚簇索引

20191125 事务以及隔离级别二

橙三吉。 提交于 2019-11-25 23:11:18
Spring的配置式事务可以把 多个操作数据库的方法 配置在一个事务中。 Spring的事务是什么?与数据库的事务是否一样? 本质上其实是同一个概念, spring的事务是对数据库的事务的封装 ,最后本质的实现还是在数据库,假如数据库不支持事务的话,Spring的事务是没有作用的. 数据库的事务说简单就只有开启,回滚和关闭 。 Spring事务对数据库事务的包装,原理就是拿一个 数据连接 ,根据Spring的事务配置, 操作这个数据连接对数据库进行事务开启,回滚或关闭操作 . Spring除了实现这些,还配合 spring的传播行为对事务进行了更广泛的管理 .其实这里还有个重要的点,那就是事务中涉及的隔离级别,以及spring如何对数据库的隔离级别进行封装. MySql中的事务嵌套 1、 Mysql中的事务必须是InnoDB 、Berkeley DB引擎,myisam不支持。 2、Mysql是 不支持嵌套事务 的,开启了一个事务的情况下,再开启一个事务,会 隐式的提交上一个事务 。 3、Mysql默认是autocommit=1,也就是说默认是立即提交,如果想开启事务,先设置autocommit=0,然后用START TRANSACTION、 COMMIT、 ROLLBACK来使用具体的事务。 4、事务控制要成对出现,有开启,必有提交和回滚,如果不匹配导致事务计时器错误

MySQL的四种事务隔离级别

时光怂恿深爱的人放手 提交于 2019-11-25 22:49:08
MySQL的四种事务隔离级别 一:事务的基本要素 原子性(Atomic):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样. 一致性(consistent):事务开始前和结束后,数据库的完整性约束没有被破坏.比如A向B转账,不可能A扣了钱,B却没有收到. 隔离性(isolation):同一时间,只允许一个事务请求同意数据,不同事务之间彼此没有任何干扰.比如A正在从一张银行卡取钱,在A取钱的过程结束前,B不能 持久性(durable):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚. 二:事务的并发问题 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据 不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据做了更新并提交,导致事务A多次读取同一个数据时,结果不一致 幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改完分数结束后发现还有一条记录没有改过来,就好像发生了幻觉一样. 小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表 三

mysql 5.7 事务隔离级别

我只是一个虾纸丫 提交于 2019-11-25 19:23:17
事务的隔离级别分为:未提交读(read uncommitted)、已提交读(read committed)、可重复读(repeatable read)、串行化(serializable)。 未提交读 :b事务读到a事务没有提交的结果。 已提交读 :b事务读到a事务已经提交的结果。 来源: https://www.cnblogs.com/yancun8141/p/11313407.html