面试宝典系列-MySQL的四种事务隔离级别
时间: 2018-08-10来源:OSCHINA
前景提要
「深度学习福利」大神带你进阶工程师,立即查看>>>
一、事务的基本要素
1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
二、事务在并发时出现问题
1、丢失更新
两个不同事物同时获得相同数据,然后在各自事务中同时修改了该数据,那么先提交的事务更新会被后提交事务的更新给覆盖掉,这种情况事务A的更新就被覆盖掉了、丢失了。
举个栗子: 事务A 事务B 读取X=100 读取X=100 写入x=X+100 写入x=X+200 事务结束x=200 事务结束x=300 最后x=300
2、脏读(未提交读)
事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
3、不可重复读
事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
举个栗子: 事务A 事务B 读取X=100 读取X=100 读取X=100 写入x=X+100 事务结束, x=200 读取X=200 (此时,在同一个事务A中, 读取的X值发生了变化!) 事务结束
4、 幻读
事务A读的时候读出了15条记录,事务B在事务A执行的过程中 增加 了1条,事务A再读的时候就变成了 16 条,这种情况就叫做幻影读。
不可重复读 和 幻读 很容易混淆,不可重复读侧重于 修改 ,幻读侧重于 新增或删除 。解决不可重复读的问题只需 锁住满足条件的行 ,解决幻读需要 锁表
三、mysql隔离级别
是:还存在,不能避免; 否:不存在,能避免
事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted) 是 是 是
不可重复读(read-committed) 可重复读(repeatable-read) 串行化(serializable)
否 否 否
是 否 否
是 是 否

四、封锁协议
排他锁(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锁,直到事务结束才释放。三级封锁协议出防止了丢失修改和读“脏”数据外,还可以进一步防止了不可重复读。
串行化:
一二三级封锁协议都是在行级加锁,而串行化是对整表加锁。读数据时对整表加共享锁,修改数据对整表加排他锁。

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

热门排行