面试宝典系列-MySQL的四种事务隔离级别

1、事务的基本要素

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

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

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

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

2、事务在并发时出现问题

一、丢失更新spa

两个不一样事物同时得到相同数据,而后在各自事务中同时修改了该数据,那么先提交的事务更新会被后提交事务的更新给覆盖掉,这种状况事务A的更新就被覆盖掉了、丢失了。code

举个栗子:对象

事务A	         事务B
读取X=100	   读取X=100
写入x=X+100	   写入x=X+200
事务结束x=200	 事务结束x=300
 	             最后x=300

二、脏读(未提交读) 事务

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

三、不可重复读it

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

举个栗子:

事务A	                   事务B
读取X=100	               读取X=100
读取X=100	               写入x=X+100
 	                       事务结束, x=200

读取X=200
(此时,在同一个事务A中,
读取的X值发生了变化!)	 
事务结束

四、幻读

事务A读的时候读出了15条记录,事务B在事务A执行的过程当中 增长 了1条,事务A再读的时候就变成了 16 条,这种状况就叫作幻影读。

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

3、mysql隔离级别

是:还存在,不能避免;   否:不存在,能避免

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

4、封锁协议

排他锁(X锁):若事务T对数据对象A加上X锁,则只容许T读取和修改A,其余任何事务都不能在对A加任何类型的锁,直到T释放A上的锁为止。这就保证了其余事务在T释放A上的锁以前不能再读取和修改A。

共享锁(S锁):若事务T对数据对象A加上S锁,则只容许T读A但不能修改A,其余事务只能再对A加S锁而不能加X锁,知道T释放A上的S锁为止。

一级封锁协议(对应 read uncommited) :

事务T在修改数据R以前必须先对其加X锁,直到事务结束才释放。一级封锁协议能够防止丢失修改,并保证事务T是可恢复的。

二级封锁协议(对应read commited):

在一级封锁协议基础上增长事务T在读数据R以前必须先对其加S锁,读完后便可释放S锁。二级封锁协议出防止了丢失修改,还能够进一步防止读“脏”数据。

三级封锁协议(对应reapetable read ):

在一级封锁协议的基础上增长事务T在读数据R以前必须先对其加S锁,直到事务结束才释放。三级封锁协议出防止了丢失修改和读“脏”数据外,还能够进一步防止了不可重复读。

串行化:

一二三级封锁协议都是在行级加锁,而串行化是对整表加锁。读数据时对整表加共享锁,修改数据对整表加排他锁。

相关文章
相关标签/搜索