如果不考虑事务的隔离性,读操作会有三个问题:脏读(读到了未提交事务的数据)、幻读(重点在于新增或者删除:在同一事务中,同样的条件,第一次和第二次读出来的记录数不一样)、不可重复读(重点是修改:在同一事务中,同样的条件,第一次读的数据和第二次读的数据不一样)。如果不考虑事务的隔离性,写操作可能会导致丢失更新数据问题,乐观锁是为了解决丢失更新问题而设计的。
所谓丢失更新数据是指在并发操作下,后提交的事务对数据的更新会覆盖先提交的事务的数据。解决丢失数据更新问题主要有两个方法:悲观锁和乐观锁,悲观锁是指同一时间只允许一个事务对同一共享数据执行操作。乐观锁是指提供一个版本号,每个事务执行数据更新之前先比较当前数据版本与数据库版本是否一致,如果一致则执行更新并将数据库版本号+1,如果不一致则不进行更新。
乐观锁一个实际的应用就是抢票功能,假设余票数为1,抢票用户为100,100个用户都可以点击看到这张余票并进行抢票,但是最终只有第一个付款成功的乘客可以抢到票。