zl程序教程

您现在的位置是:首页 >  其它

当前栏目

乐观锁和悲观锁

乐观 悲观
2023-06-13 09:14:04 时间

乐观锁和悲观锁

Q 为什么需要锁(并发控制)
A 在多用户环境中,在同一时间可能会有多个用户更新相同的记录,会产生冲突,这就是著名的并发问题
典型的冲突:
-- 丢失更新:一个事务的更新覆盖了其它事务的更新结果,这就是所谓的更新丢失。例如:用户A把值从6改成2,用户B把值从2改为6,则用户A丢失了他的更新。
-- 脏读:当一个事务读取其它完成一半食物的记录时,就会发生脏读。例如:用户A、B看到的值都是6,用户B把值改成了2,用户A读到的值仍为6。
为了解决这些并发带来的问题,需要引入并发控制机制
并发控制机制
-- 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。
-- 乐观锁:假设不会发生并发冲突问题,只是提交操作时检查是否违反数据完整性。乐观锁不能解决脏读的问题。
乐观锁介绍:
-- 在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测
实现
-- 使用数据版本记录机制。一般是通过为数据表增加一个数字类型的version字段来实现。读取数据时,将version字段读出,数据每次更新version都加一。当我们提交更新时,判断更新时的version值和第一次取出来的值是否相等,等则可以更新,反之不可以更新。
-- 和第一个相近,同样是增加一个字段,字段名随意,字段值使用的是时间戳,判断更新时的时间戳值和第一次取出来的值是否相等,等则可以更新,反之不可以更新。

悲观锁
-- 需要使用数据库的锁机制,根据锁的作为范围不同,可以划分为:页面锁(表级锁)、行级锁、。如MySQL中,不同的数据引擎使用的锁是不同的,例如InnoDB行锁是通过给索引上的索引项加锁来实现的,InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!