暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mysql怎么减少行锁对性能的影响?

小胡的博客 2019-04-15
241
  1. 行锁就是针对数据表中记录的锁,比如事务A更新了一行,而这时候事务B也要更新一行,则必须等事务A的操作完成后才能进行更新。


  2. 举个栗子

    假设ID是表T的主键


  3. 实际上事务B的update语句会被阻塞,直到事务A执行commit之后,事务B才能继续执行。所以A持有的两个记录的行锁,都是在commit的时候才释放的。

  4. 在InnoDB事务中,行锁是在需要的时候才加上的,但是并不是不需要了就立刻释放,而是要要等到事务结束的时候才释放,这个就是两阶段锁协议。

  5. 假如你的事务中需要锁多个行,要把最可能造成冲突,最可能影响并发度的锁尽量往后放。

  6. 假设你负责实现一个电影票在线交易业务,顾客A要在影院B购买电影票,这个业务要设计一下操作:

    1 从顾客A账户余额扣除电影票价

    2 给电影院B账户增加这张电影票价

    3 记录一天交易日志

  7. 上面我们需要更新两条记录,并insert一条记录,当然,为了保证原子性,我们要把这个三个操作放在一个事务中,你会怎样安排三个语句在事务中的顺序呢?

  8. 如果同时有另外一个顾客C要在影院B买票,那么两个事务冲突的部分就是语句2了,因为它们要    更新同一个影院的账户余额,需要修改同一行数据。

  9. 根据两阶段协议,不论你怎样安排语句顺序,所有的操作需要的行锁都是在事务提交的时候才释放的,所以如果你把语句2安排在最后,比如按照3,1,2(第6条)这样的顺序,那么影院账户余额这一行的锁时间最少,这就最大程度的减少了事务之间额锁等待,提升了并发度。


      

   

文章转载自小胡的博客,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论