悲观锁及乐观锁
一、三种典型不一致:
假设数据A=1
1.脏读:
-> T1读取A=1
-> T1修改写入A=2
-> T2读取A=2
-> T1rollback,即A=1
T2读取的数据是错误的
2.丢失修改
-> T1读取A=1
-> T2读取A=1
-> T1修改A=A+1=2
-> T2修改A=A+1=2
-> T1写A=2
-> T2写A=2
修改两次A+1,但是A的值只加1
3.不能重复读
-> T1读取A=1
-> T2读取A=1
-> T2修改并写入A=2
-> T1再次读取A=2
T1第一次读取和第二次读取值不同
二、悲观锁和乐观锁
1.悲观锁(独占锁)synchronized:
假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。
具有强烈的独占和排他特性。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。
因此数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。
乐观锁compare and swap:
假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。乐观锁不能解决脏读的问题。
基于数据版本( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
三、进程互斥和进程同步:
写的很好