• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Mysql悲观锁和乐观锁的使用示例

    悲观锁

    悲观锁,认为数据是悲观的。当我们查询数据的时候加上锁。防止其他线程篡改,直到对方拿到锁,才能修改。

    比如,有如下的表。status=1表示可以下单,status=2表示不可以下订单。假如在并发的过程中有两个用户同时查到status=1,那么从逻辑上来说都可以去新增订单,但是会造成商品超卖。

    如下例子

    CREATE TABLE `goods` (
     `id` int(11) NOT NULL AUTO_INCREMENT,
     `name` varchar(255) DEFAULT NULL,
     `status` tinyint(4) DEFAULT NULL,
     `version` int(11) DEFAULT NULL,
     PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4
    INSERT INTO demo.goods (id, name, status, version) VALUES (1, 'test', 1, 1);

    session1执行

    set autocommit=0;
    begin;
    select *
    from goods where id=1 and goods.status=1 for update ;
    update goods set status=2 where id=1;

    session2执行

    begin;
    select * from goods where id=1 for update;

    这时候session2是阻塞的,因为锁还在session1,所以锁一直在等待。如果session1一直不提交,那么session2将在一定时间后超时断开连接,并且报

    (1205, ‘Lock wait timeout exceeded; try restarting transaction')错误,

    具体的锁等待时间可以通过设置innodb_lock_wait_timeout参数进行控制。

    如果此时在session1中执行commit 操作,那么session2将得到查询结果,并把锁交给session2。

    我们还可以通过

    show status like 'innodb_row_lock_%';

    来进一步查看锁信息。

    乐观锁

    乐观锁不同于悲观锁,乐观锁是通过自身的程序实现,而不是mySql自身实现。

    乐观锁查询的时不上锁,只有在更新的时候检查版本号。

    比如我们查询到goods表中version 为1 那么在更新这个表的时候Sql将是

    select * from goods where id=1;
    update goods set status=2,version=version+1 where id=1 and version=1;

    这里的version是查询时候的版本号,每次更改将会导致version+1。如果版本号不匹配更新将不成功。

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

    您可能感兴趣的文章:
    • MySQL中的悲观锁与乐观锁
    • mysql 悲观锁与乐观锁的理解及应用分析
    • 实例讲解MySQL中乐观锁和悲观锁
    • 浅析MySQL - MVCC
    • mysql多版本并发控制MVCC的实现
    • 关于Mysql隔离级别、锁与MVCC介绍
    • MySQL中的乐观锁,悲观锁和MVCC全面解析
    上一篇:mysql 8.0.13 安装配置图文教程
    下一篇:关于MySQL自增ID的一些小问题总结
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Mysql悲观锁和乐观锁的使用示例 Mysql,悲观,锁,和,乐观,的,