课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在学习线程安全的时候给大家提到过锁的应用,而今天我们就再来了解一下,数据库编程开发锁的应用都有哪些应用需求。
1、读未提交(READ_UNCOMMITED)
(1)事务对当前被读取的数据不加锁。
(2)事务在更新某数据的瞬间(发生更新的瞬间),必须先对其加行级共享锁,直到事务结束才释放。
理解:
1、事务B更改了某个数据,此时加的是行级共享锁,事务A还是可以读取到这个更改了的数据,如果事务B回滚,事务A读取到的数据发生变化,造成脏读。
2、事务A读取某个数据,事务B对其修改并提交,事务A再次读取,得到的是不一样的结果,造成不可重复读
3、同理会造成幻读,因为增加了新的一行数据,那行数据没有添加排它锁
2、读已提交(READ_COMMITED)
(1)事务对当前被读取的数据加行级共享锁(当读到时才加锁),一旦读完,立即释放行级共享锁。
(2)事务更新某数据的瞬间(就是发生更新的瞬间),必须对其加行级排他锁,直到事务结束才释放。
理解:由(2)可以知道,事务B修改某个数据的时候,对当前行添加了行级排它锁,于是事务A直到事务结束才能访问这个数据,如果这个数据发生了回滚,也不会造成脏读,但如果数据没有回滚,两次查到的数据不一致,造成不可重复读,也会造成幻读,因为只是对修改的行加了排它锁,其他行没有添加。
3、可重复读(REPEATABLE_READ)
(1)事务读取某数据的瞬间(就是开始读取的瞬间),必须先对其加行级共享锁,事务结束才释放。
(2)事务更新某数据的瞬间(就是发生更新的瞬间),必须先对其加行级排他锁,事务结束才释放。
理解:事务A读取某个数据的时候,添加了行级共享锁,只能读不能改,因此不会造成修改,也就不存在脏读和不可重复读,但是幻读还是可能存在的,因为只是当前行添加了排它锁,其他行没有锁。
4、可串行化(SERIALIZABLE)
(1)事务在读取数据时,必须先对其加表级共享锁,直到事务结束才释放。
(2)事务在更新数据时,必须先对其加表级排他锁,直到事务结束才释放。
理解:整个表都添加了锁,也就不存在增删改了,但是这样会大大降低数据库的性能,所以不建议使用这个隔离级别。
不可重复读和幻读的区别
不可重复读重点在于update和delete,而幻读的重点在于insert。如果使用锁机制来实现这两种隔离级别,在可重复读中,该sql一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复读了。
但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会发现莫名其妙多了一条之前没有的数据,这就是幻读,不能通过行锁来避免。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。