美文网首页
乐观锁和悲观锁

乐观锁和悲观锁

作者: 苍老师的眼泪 | 来源:发表于2020-11-09 00:57 被阅读0次

    一、悲观锁
    在修改数据之前先锁定,再修改的方式被称之为悲观并发控制。这是一种对数据的修改持有悲观态度的并发控制方式。
    二、乐观锁
    乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。乐观锁适用于读操作多的场景,这样可以提高程序的吞吐量。

    mysql实操(mysql 8.0.20)

    select ... for update是实现悲观锁的关键语句。
    由于InnoDB支持行级锁,所以:

    select * from goods where id = 2 for update;
    

    锁住id为2的那行时,另一个会话对id为1的数据进行update操作时不受影响。
    不一定时'id',但必须时主键或唯一索引。
    但如果锁住了全部(select * from xxx for update)时,则对该表的任意数据进行update
    操作都将会进入阻塞状态。

    悲观锁案例1:
    (事务隔离级别为mysql8默认的可重复读)

    1号会话
    set autocommit = 0; 
    begin;
    select * from goods  for update;
    
    2号会话
    update goods set amount = 20 where id = 1;
    //阻塞中。。。(如果阻塞时间超过配置值则会失败,这里假设不会到底该值)
    
    1号会话
    commit
    //2号会话从阻塞状态继续执行,执行成功后数据将会被修改。
    

    悲观锁案例2:
    (事务隔离级别为mysql8默认的可重复读)

    1号会话
    set autocommit = 0; 
    begin;
    select * from goods  for update;
    update goods set amount = 19 where id = 1;
    
    2号会话
    update goods set amount = 21 where id = 1;
    //阻塞中。。。(如果阻塞时间超过配置值则会失败,这里假设不会到底该值)
    
    1号会话
    commit
    //2号会话从阻塞状态继续执行,执行成功后数据将是2号会话更新的数据。
    

    相关文章

      网友评论

          本文标题:乐观锁和悲观锁

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