lock in share model(共享锁)和 for update(排他锁)事务控制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/caox_nazi/article/details/83817746

lock in share model(共享锁)和 for update(排他锁)事务控制

【select ... lock in share model(共享锁)】:

在符合条件的rows上都加了共享锁,这样的话,其他session可以读取这些记录,也可以继续添加IS锁,但是无法修改这些记录直到你这个加锁的session执行完成(否则直接锁等待超时)。

【select ... for update(排他锁)】: 

在符合条件的rows上都加了排它锁,其他session也就无法在这些记录上添加任何的S锁或X锁。如果不存在一致性非锁定读的话,那么其他session是无法读取和修改这些记录的,但是innodb有非锁定读(快照读并不需要加锁),for update之后并不会阻塞其他session的快照读取操作,除了select ...lock in share mode和select ... for update这种显示加锁的查询操作。

【共享锁】和【排他锁】均阻塞不了 【快照读】

 【select .. for update (排他锁) 应用场景】:

【举例说明】: 

【TABLE】: t_child(子表); t_parent(母表) 【关联表】

映射关系:child_id(t_child) <-> c_child_id(t_parent)

【问题】: => insert child_id=100 (in t_child)  存在风险
【原因】: => del c_child_id =100 (in t_parent) 可能parent表已删除c_child_id=100
【结果】: => 导致业务数据不一致

【正确解决办法】:=>  (1)锁定parent表该条记录 select * from parent where c_child_id=100 lock in share mode;
                      (2)执行:insert into t_child(child_id) values (100)

【lock in share mode】 和【select ... for update】用法示例图:

 lock in share mode:

 select ... for update:

【结论】: 

lock in share mode适用于两张表存在业务关系时的一致性要求,for  update适用于操作同一张表时的一致性要求。

【参考文献】: 深入理解SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE

 

 

猜你喜欢

转载自blog.csdn.net/caox_nazi/article/details/83817746
今日推荐