zoukankan      html  css  js  c++  java
  • mysql悲观锁

    悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念。

    悲观锁(Pessimistic Lock)

    悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。通常所说的“一锁二查三更新”即指的是使用悲观锁。通常来讲在数据库上的悲观锁需要数据库本身提供支持,即通过常用的select … for update操作来实现悲观锁。当数据库执行select for update时会获取被select中的数据行的行锁,因此其他并发执行的select for update如果试图选中同一行则会发生排斥(需要等待行锁被释放),因此达到锁的效果。select for update获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用。

    这里需要注意的一点是不同的数据库对select for update的实现和支持都是有所区别的,例如oracle支持select for update no wait,表示如果拿不到锁立刻报错,而不是等待,mysql就没有no wait这个选项。另外mysql还有个问题是select for update语句执行中所有扫描过的行都会被锁上,这一点很容易造成问题。因此如果在mysql中用悲观锁务必要确定走了索引,而不是全表扫描。

    使用例子

    1.悲观锁需要等待提交commit后才可以执行

    set autocommit = 0;
    BEGIN;
    SELECT * FROM `fook_business` where id = 1 FOR UPDATE;
    UPDATE `fook_business` set `areas_id` = 2 where id = 1;

    2.然後手動更新 id=1 這條數據,看到更新失敗,因為 id=1 這條被鎖住了

    UPDATE `fook_business` set `areas_id` = 3 where id = 1;

    3.commit提交成功

    更新库存时,用mysql锁解决高并发问题的:https://mp.weixin.qq.com/s/gM_YT669SjJycflXTb_eBQ

  • 相关阅读:
    设计模式_EventObject和EventListener
    设计模式_Observable与Observer
    zooKeeper_《ZooKeeper官方指南》一致性保障
    thread_为什么多线程是个坏主意
    gtk+学习笔记(三)
    linux c下输入密码不回显
    浮点数在计算机内存中的存储方式
    gtk+学习笔记(二)
    linux下c图形化编程之gtk+2.0简单学习
    关于字符串排序合并的问题
  • 原文地址:https://www.cnblogs.com/clubs/p/10384455.html
Copyright © 2011-2022 走看看