欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

乐观锁和悲观锁

程序员文章站 2022-06-02 11:13:33
...

乐观锁和悲观锁

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将使用表锁!  
相关标签: 数据库 事务