美文网首页
Mysql | 锁——行锁

Mysql | 锁——行锁

作者: leafzl | 来源:发表于2019-01-14 06:21 被阅读29次

    今天我们来聊聊行锁,大家都知道MyISAM 引擎不支持行锁,InnoDB 是支持行锁的,这也是 MyISAM 被 InnoDB 替代的重要原因之一。
    行锁就是针对数据表中行记录的锁。这很好理解,比如事务 A 更新了一行,而这时候事务 B 也要更新同一行,则必须等事务 A 的操作完成后才能进行更新。
    在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。
    知道了怎么原理,怎样对我们使用事务有帮助了?
    那就是,如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。
    例子:
    假设你负责实现一个电影票在线交易业务,顾客 A 要在影院 B 购买电影票。我们简化一点,这个业务需要涉及到以下操作:
    从顾客 A 账户余额中扣除电影票价;
    给影院 B 的账户余额增加这张电影票价;
    记录一条交易日志。
    也就是说,要完成这个交易,我们需要 update 两条记录,并 insert 一条记录。
    为了保证交易的原子性,我们要把这三个操作放在一个事务中。
    试想如果同时有另外一个顾客 C 要在影院 B 买票,那么这两个事务冲突的部分就是语句 2 了。因为它们要更新同一个影院账户的余额,需要修改同一行数据。 根据两阶段锁协议,不论你怎样安排语句顺序,所有的操作需要的行锁都是在事务提交的时候才释放的。
    所以,如果你把语句 2 安排在最后,比如按照 3、1、2 这样的顺序,那么影院账户余额这一行的锁时间就最少。这就最大程度地减少了事务之间的锁等待,提升了并发度。
    这就是行锁的魅力。但行锁也会出问题哦,这就是明天要讲的死锁。
    今天就写到这里啊、


    Mysql | 锁——行锁

    相关文章

      网友评论

          本文标题:Mysql | 锁——行锁

          本文链接:https://www.haomeiwen.com/subject/nhwrdqtx.html