悲观锁和乐观锁的理解

来源:互联网 发布:javascript高级编程 编辑:程序博客网 时间:2024/05/22 07:50

查了一下悲观锁和乐观锁的目的主要是为了避免脏读,看起来和oracle的默认隔离级别READ-COMMITED是冲突的。因为READ-COMMITED是可以避免脏读的。

细想一下,果然有问题。请看脏读的定义:

T1修改了记录,还没有提交,T2读取了该记录,T1回滚了修改。

READ-COMMITED能够防止当前事务读取之前事务正在修改的数据,但是不能防止它之后的事务修改当前事务正在读的数据或者结果集。

所以悲观锁应该是为了避免幻想读和不可重复读。悲观锁将正在读的数据锁住(实现方式是select语句后面加上for update),这样它之后的事务就不可以修改数据。

乐观锁和读数据的正确性没有关系,乐观锁是为了避免两个事务同时修改同一条数据,实现方式是在目标表上增加一列来记录版本号,每一个修改会把版本号+1,在提交的时候判断版本号是否小于+1后的版本号,如果不是,就知道别人修改了这条数据,进行相应的业务处理, 例如事务的回滚等。

 

0 0
原创粉丝点击