30秒读懂mysql四种事务隔离级别

1、事务的基本要素(ACID)mysql

  一、原子性(Atomicity):事务开始后全部操做,要么所有作完,要么所有不作,不可能停滞在中间环节。事务执行过程当中出错,会回滚到事务开始前的状态,全部的操做就像没有发生同样。也就是说事务是一个不可分割的总体,就像化学中学过的原子,是物质构成的基本单位。sql

   二、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。好比A向B转帐,不可能A扣了钱,B却没收到。
数据库

   三、隔离性(Isolation):同一时间,只容许一个事务请求同一数据,不一样的事务之间彼此没有任何干扰。好比A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转帐。并发

   四、持久性(Durability):事务完成后,事务对数据库的全部更新将被保存到数据库,不能回滚。性能

 

2、事务的并发问题spa

  一、脏读:事务A读取了事务B更新的数据,而后B回滚操做,那么A读取到的数据是脏数据3d

  二、不可重复读:事务 A 屡次读取同一数据,事务 B 在事务A屡次读取的过程当中,对数据做了更新并提交,致使事务A屡次读取同一数据时,结果 不一致。blog

  三、幻读:系统管理员A将数据库中全部学生的成绩从具体分数改成ABCDE等级,可是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉同样,这就叫幻读。事务

  小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住知足条件的行,解决幻读须要锁表ci

 

3、MySQL事务隔离级别

事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

mysql默认的事务隔离级别为repeatable-read

未提交读

未提交读的意思就是好比原先name的值是小刚,而后有一个事务B`update table set name = '小明' where id = 1`,它还没提交事务。同时事务A也起了,有一个select语句`select name from table where id = 1`,在这个隔离级别下获取到的name的值是小明而不是小刚。那万一事务B回滚了,实际数据库中的名字仍是小刚,事务A却返回了一个小明,这就称之为脏读。

未提交读

 

 

已提交读

按照上面那个例子,在已提交读的状况下,事务A的select name 的结果是小刚,而不是小明,由于在这个隔离级别下,一个事务只能读到另外一个事务修改的已经提交了事务的数据。可是有个现象,仍是拿上面的例子说。若是事务B 在这时候隐式提交了时候,而后事务A的select name结果就是小明了,这都没问题,可是事务A还没结束,这时候事务B又`update table set name = '小红' where id = 1`而且隐式提交了。而后事务A又执行了一次`select name from table where id = 1`结果就返回了小红。这种现象叫不可重复读。

 

 

已提交读

可重复读

可重复读就是一个事务只能读到另外一个事务修改的已提交了事务的数据,可是第一次读取的数据,即便别的事务修改的这个值,这个事务再读取这条数据的时候仍是和第一次获取的同样,不会随着别的事务的修改而改变。这和已提交读的区别就在于,它重复读取的值是不变的。因此取了个贴切的名字叫可重复读。按照这个隔离级别下那上面的例子就是:

可重复读

 

 

串行化

上面三个隔离级别对同一条记录的读和写均可以并发进行,可是串行化格式下就只能进行读-读并发。只要有一个事务操做一条记录的写,那么其余要访问这条记录的事务都得等着。

串行化

 

 

通常没人用串行化,性能比较低,经常使用的是已提交读和可重复读。而已提交读和可重复读的实现主要是基本版本链和readView。而它们之间的区别其实就是生成readView的策略不一样

相关文章
相关标签/搜索