查了一下悲观锁和乐观锁的目的主要是为了避免脏读,看起来和oracle的默认隔离级别READ-COMMITED是冲突的。因为READ-COMMITED是可以避免脏读的。
细想一下,果然有问题。请看脏读的定义:
T1修改了记录,还没有提交,T2读取了该记录,T1回滚了修改。
READ-COMMITED能够防止当前事务读取之前事务正在修改的数据,但是不能防止它之后的事务修改当前事务正在读的数据或者结果集。
所以悲观锁应该是为了避免幻想读和不可重复读。悲观锁将正在读的数据锁住(实现方式是select语句后面加上for update),这样它之后的事务就不可以修改数据。
乐观锁和读数据的正确性没有关系,乐观锁是为了避免两个事务同时修改同一条数据,实现方式是在目标表上增加一列来记录版本号,每一个修改会把版本号+1,在提交的时候判断版本号是否小于+1后的版本号,如果不是,就知道别人修改了这条数据,进行相应的业务处理, 例如事务的回滚等。