并发 *** 作带来的数据不一致性包括三类:丢失修改、不可重复读和读“脏”数据。
避免不一致性的方法和技术就是并发控制,最常用的技术是封锁技术;也可以用其他技术,例如在分布式数据库系统中可以采用时间戳方法来进行并发控制。
丢失修改:两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了(覆盖了)T1提交的结果,导致T1的修改被丢失。
不可重复读:不可重复读是指事务T1读取数据后,事务T2执行更新 *** 作,使T1无法再现前一次读取结果。
读“脏”数据:读“脏”数据是指事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据就为“脏”数据,即不正确的数据。
MyISAM和InnoDB存储引擎使用的锁:
封锁粒度小:
由于InnoDB存储引擎支持的是行级别的锁,因此意向锁(因为意向锁是表锁)其实不会阻塞除全表扫以外的任何请求。故表级意向锁与行级锁的兼容性如下所示
参考
参考
行锁的三种算法:
这条语句阻止其他事务插入10和20之间的数字,无论这个数字是否存在。 间隙可以跨越0个,单个或多个索引值。
>
一级封锁协议: 事务T在修改数据R之前必须先对其加X锁, 直到事务结束才释放。但是如果只是读数据,不需加锁,因此会造成读脏数据的情况
二级封锁协议: 一级封锁协议加上事务T在读取数据R之前必须先对其加S锁, 读完后即可释放²可防止读脏数据, 丢失修改不能保证可重复读
一级封锁协议是:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。
注意,该协议是规定在修改数据R之前必须加锁。所以如果事务T仅是读数据而不对其进行修改,是不需要加锁的;事务T在修改R之前,其他事务是能对R进行读取的,所以它不能保证可重复读和不读“脏”数据。
基本的封锁类型有两种:排它锁(X锁)和共享锁(S锁)所谓X锁,是事务T对数据A加上X锁时,只允许事务T读取和修改数据A,所谓S锁,是事务T对数据A加上S锁时,其他事务只能再对数据A加S锁,而不能加X锁,直到T释放A上的S锁
若事务T对数据对象A加了S锁,则T就可以对A进行读取,但不能进行更新(S锁因此又称为读锁),在T释放A上的S锁以前,其他事务可以再对A加S锁,但不能加X锁,从而可以读取A,但不能更新A
以上就是关于并发 *** 作会带来哪些数据不一致性全部的内容,包括:并发 *** 作会带来哪些数据不一致性、深入理解MySQL数据库各种锁(总结)、谁能解释一下数据库中的二级封锁协议等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)