MySQL 乐观锁 悲观锁 共享锁 排他锁

MySQL 乐观锁 悲观锁 共享锁 排他锁,第1张

概述乐观锁 乐观锁是逻辑概念上的锁,不是数据库自带的,需要我们自己去实现。乐观锁是指 *** 作数据库时(更新 *** 作),想法很乐观,认为这次的 *** 作不会导致冲突,在 *** 作数据时,并不进行任何其他的特殊处理(也就是不加锁 @H_301_0@乐观锁

乐观锁是逻辑概念上的锁,不是数据库自带的,需要我们自己去实现。乐观锁是指 *** 作数据库时(更新 *** 作),想法很乐观,认为这次的 *** 作不会导致冲突,在 *** 作数据时,并不进行任何其他的特殊处理(也就是不加锁),而在进行更新后,再去判断是否有冲突了。

通常实现是这样的:在表中的数据进行 *** 作时(更新),先给数据表加一个版本(version)字段,每 *** 作一次,将那条记录的版本号加1。也就是先查询出那条记录,获取出version字段,如果要对那条记录进行 *** 作(更新),则先判断此刻version的值是否与刚刚查询出来时的version的值相等,如果相等,则说明这段期间,没有其他程序对其进行 *** 作,则可以执行更新,将version字段的值加1;如果更新时发现此刻的version值与刚刚获取出来的version的值不相等,则说明这段期间已经有其他程序对其进行 *** 作了,则不进行更新 *** 作。

举例:

下单 *** 作包括3步骤:

1.查询出商品信息

select (status,version) from t_goods where ID=#{ID}

2.根据商品信息生成订单

3.修改商品status为2

update t_goods set status=2,version=version+1 =#{ID} and version=#{version};

 

@H_301_0@悲观锁

与乐观锁相对应的就是悲观锁了。悲观锁就是在 *** 作数据时,默认此 *** 作会出现数据冲突,所以在进行每次 *** 作时都要通过获取锁才能进行对相同数据的 *** 作,这点跟java中的synchronized很相似,所以悲观锁需要耗费较多的时间。悲观锁的实现,依靠数据库提供的锁机制,使用的时候直接调用数据库的相关语句就可以了。

数据库上的 *** 作可以归纳为两种:读和写。多个事务同时读取一个对象的时候,是不会有冲突的。同时读和写,或者同时写才会产生冲突。

MyIsam引擎会为查询和更新等 *** 作自动添加表级锁,因此它的情况比较简单。InnoDB引擎情况比较复杂,它通常会定义两种锁:共享锁和排它锁。

共享锁

共享锁(Shared Lock,也叫S锁)表示对数据进行读 *** 作,加锁后其他事务可以读,但不能写。多个事务可以同时为一个对象加共享锁。

SELECT ... LOCK IN SHARE MODE走的是IS锁(意向共享锁),即在符合条件的rows上都加了共享锁,这样的话,其他人可以读取这些记录,也可以继续添加IS锁,但是无法修改这些记录直到你这个加锁的过程执行完成(完成的情况有:事务的提交,事务的回滚,否则直接锁等待超时)。

SELECT ... LOCK IN SHARE MODE的应用场景适合于两张表存在关系时的写 *** 作,拿MysqL官方文档的例子来说,一个表是child表,一个是parent表,假设child表的某一列child_ID映射到parent表的c_child_ID列,那么从业务角度讲,此时我直接insert一条child_ID=100记录到child表是存在风险的,因为刚insert的时候可能在parent表里删除了这条c_child_ID=100的记录,那么业务数据就存在不一致的风险。正确的方法是再插入时执行select * from parent where c_child_ID=100 lock in share mode,锁定了parent表的这条记录,然后执行insert into child(child_ID) values (100)就不会存在这种问题了。

排它锁

排他锁(Exclusive Lock,也叫X锁)也叫写锁。加锁后,其他事务不能读取,也不能写。

如果一个事务对对象加了排他锁,其他事务就不能再给它加任何锁了。

产生排他锁的sql: SELECT ... FOR UPDATE

简单总结

共享锁适用于两张表存在业务关系时的一致性要求,排它锁适用于 *** 作同一张表时的一致性要求。

总结

以上是内存溢出为你收集整理的MySQL 乐观锁 悲观锁 共享锁 排他锁全部内容,希望文章能够帮你解决MySQL 乐观锁 悲观锁 共享锁 排他锁所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1151497.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存