SELECT..FOR UPDATE和LOCK IN SHARE MODE替代方案

说明

  SELECT..FOR UPDATE是互斥锁,LOCK IN SHARE MODE是读写锁,都是为了解决“select+update并发更新的问题”,但是存在行锁升级为表锁的风险,影响并发,不建议使用

Innodb行锁原理

  InnoDB行锁是通过给索引上的索引项加锁来实现的,这意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!但是,是否走索引是由存储引擎决定的,对应用程序来说不可控的。

If you have no indexes suitable for your statement and MySQL must scan the entire table to process the statement, every row of the table becomes locked, which in turn blocks all inserts by other users to the table. It is important to create good indexes so that your queries do not unnecessarily scan many rows.

select+update并发更新问题描述:

  并发事务场景下存在数据更新被覆盖的问题,具体场景如下图所示:事务隔离级别是read-committed,事务1和事务2同时更新同一行数据,假设事务1先获取锁执行了更新操作,事务2后执行,数据库中subid的最终值为32,事务1更新的值被覆盖。
  这里写图片描述
这里写图片描述

原因:

  读不加锁写加锁(互斥锁),同一时刻只有一个事务能够获取到锁执行更新操作,其它事务阻塞等待直到获取锁的事务提交或回滚。

解决方案:

方案1:由应用层面保证并发安全性,比如分布式锁,或者路由策略等;
方案2:乐观锁机制,适用于并发量不大的场景;

参考:

  1. http://www.topthink.com/topic/815.html;
  2. https://dev.mysql.com/doc/refman/5.6/en/innodb-locking-reads.html
  3. https://lanjingling.github.io/2015/10/10/mysql-hangsuo/;
  4. https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.html
  5. https://coolshell.cn/articles/6790.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值