美文网首页程序员
MySQL中的锁(行锁,表锁,乐观锁,悲观锁,共享锁,排他锁)

MySQL中的锁(行锁,表锁,乐观锁,悲观锁,共享锁,排他锁)

作者: 小新是个程序媛 | 来源:发表于2018-05-14 17:35 被阅读280次

    1. 行锁

    给某一行记录上锁,目前只有InnoDB引擎支持行锁

    2. 表锁

    给一个整张表上锁

    3. 乐观锁

    本身很乐观,认为在操作数据时(更新操作),默认别的线程并不会操作数据发生冲突,所以在每次操作时并不会上锁,只是在更新时判断别的线程在此期间是否有做修改,如果有修改该操作就无效

    通常实现是这样的:在表中的数据进行操作时(更新),先给数据表加一个版本(version)字段,每操作一次,将那条记录的版本号加1。也就是先查询出那条记录,获取出version字段,如果要对那条记录进行操作(更新),则先判断此刻version的值是否与刚刚查询出来时的version的值相等,如果相等,则说明这段期间,没有其他程序对其进行操作,则可以执行更新,将version字段的值加1;如果更新时发现此刻的version值与刚刚获取出来的version的值不相等,则说明这段期间已经有其他程序对其进行操作了,则不进行更新操作。

    #1.查询出商品信息
    select (status,status,version) from t_goods where id=#{id}
    
    #2.修改商品status为2
    set status=2,version=version+1 where id=#{id} and version=#{version};
    

    4. 悲观锁

    (大多数情况下依靠数据库的锁机制实现,开销比较大)
    本身很悲观,认为在操作数据时总会发生冲突,所以在每次操作时都需要给相应的数据加上锁来避免冲突,所以悲观锁比较耗时,另外与乐观锁不同悲观锁是由数据库自己实现的,所以要用的时候可以直接调用数据库的相关语句.
    共享锁和排他锁是悲观锁的不同实现,但都属于悲观锁

    • 共享锁(lock in share mode)
      共享锁又称读锁,一个线程给数据加上共享锁之后,其他线程只能读数据不能修改数据
    • 排他锁(for update)
      排他锁又称写锁,跟共享锁的区别是,其他线程既不能读也不能写数据

    相关文章

      网友评论

        本文标题:MySQL中的锁(行锁,表锁,乐观锁,悲观锁,共享锁,排他锁)

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