恼骚

最近在搞并发的问题,订单的异步通知和主动查询会存在并发的问题,用到了Mysql数据库的 for update 锁

在TP5直接通过lock(true),用于数据库的锁机制

Db::name(‘pay_order‘)->where(‘order_no‘,‘S1807081342018949’)->lock(true)->find();

打印生成的SQL语句

SELECT * FROM `pay_order` WHERE `order_no` = ‘S1807081342018949‘ LIMIT 1 FOR UPDATE

for update 是什么?

在oracle中,利用 select * for update 可以锁表。假设有个表单products ,里面有id跟name二个栏位,id是主键。

例1: (明确指定主键,并且有此笔资料,row lock)

SELECT * FROM products WHERE id=‘3‘ FOR UPDATE;

例2: (明确指定主键,若查无此笔资料,无lock)

SELECT * FROM products WHERE id=‘-1‘ FOR UPDATE;

例3: (无主键,table lock)

SELECT * FROM products WHERE name=‘Mouse‘ FOR UPDATE;

例4: (主键不明确,table lock)

SELECT * FROM products WHERE id<>‘3‘ FOR UPDATE;

例5: (主键不明确,table lock)

SELECT * FROM products WHERE id LIKE ‘3‘ FOR UPDATE;

注1: FOR UPDATE仅适用于InnoDB,且必须在交易区块(BEGIN/COMMIT)中才能生效。

先开始一把

使用悲观锁的原理就是,当我们在查询出 pay_order 信息后就把当前的数据锁定,直到我们修改完毕后再解锁。那么在这个过程中,因为 pay_order 被锁定了,就不会出现其他操作者来对其进行修改了。

第一次,开启事务,但是不提交事务

异步通知

-- 开启事务

START TRANSACTION;

-- 查询订单

SELECT id,order_no,`status` FROM `pay_order` WHERE `order_no` = ‘S1807081342018949‘ LIMIT 1 FOR UPDATE;

-- 修改订单

UPDATE `pay_order` SET `status` = 11 WHERE id = 347;

COMMIT;

-- 查询数据是否修改成功

SELECT id,order_no,`status` FROM `pay_order` WHERE `order_no` = ‘S1807081342018949‘ LIMIT 1 FOR UPDATE;

执行结果:很快就执行完毕了,但是数据并没有修改成功(注意:但是重复执行一次,则数据又修改成功了)

主动查询

1、加锁

SELECT id,order_no,`status` FROM `pay_order` WHERE `order_no` = ‘S1807081342018949‘ LIMIT 1 FOR UPDATE;

执行结果,一直在阻塞中

过一会,会自动取消锁机制

[Err] 1205 - Lock wait timeout exceeded; try restarting transaction

2、不加锁

SELECT id,order_no,`status` FROM `pay_order` WHERE `order_no` = ‘S1807081342018949‘;

执行结果,没有阻塞,则能正常查询出数据,不会受第一个事务的影响

第二次,开启事务,提交事务

异步查询开启事务,提交事务

主动查询加锁则不受影响

总结:锁如果是回滚或者提交事务,会自动释放掉锁的。

下面研究以下行锁和表锁

例1: 明确指定主键,并且有此数据,row lock

show variables like ‘%storage_engine%‘;

原文:https://www.cnblogs.com/tinywan/p/9655664.html

mysql悲观锁 更新_MySQL学习笔记(四)悲观锁 for update相关推荐

  1. mysql新增表字段回滚_MySql学习笔记四

    MySql学习笔记四 5.3.数据类型 数值型 整型 小数 定点数 浮点数 字符型 较短的文本:char, varchar 较长的文本:text, blob(较长的二进制数据) 日期型 原则:所选择类 ...

  2. mysql行级安全_MySQL学习笔记(五):MySQL表级锁和行级锁

    一:概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  3. mysql没法修改数据_MySQL学习笔记之数据的增、删、改实现方法

    本文实例讲述了MySQL学习笔记之数据的增.删.改实现方法.分享给大家供大家参考,具体如下: 一.增加数据 插入代码格式: insert into 表明 [列名-] values (值-) creat ...

  4. mysql原生建立索引_MySQL学习笔记之索引

    索引是存储引擎用于快速找到记录的一种数据结构. 索引对于良好的性能非常关键.尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要.在数据量较小且负载较低时,不恰当的索引对性能的影响可能还不明显,但 ...

  5. mysql 查找相似数据_MySQL学习笔记之索引

    索引是存储引擎用于快速找到记录的一种数据结构. 索引对于良好的性能非常关键.尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要.在数据量较小且负载较低时,不恰当的索引对性能的影响可能还不明显,但 ...

  6. mysql传小马_Mysql 学习笔记

    1.关系型数据库 关系:由行和列组成的二维表 表:至少要有列,可以没有行. 列:是实体的属性. 数据模型:层次模型.网状模型.关系模型.非关系模型. DBMS:DataBase Mangenent S ...

  7. mysql 加号的作用_MySQL学习笔记(一)

    MySQL学习笔记(一) 作者:易成勇 案例来源:AI技术前线 MySQL常用命令 1.查看当前所有数据库 show databases; 2.打开指定的库 use 库名 3.查看当前库的所有表 sh ...

  8. java同步锁优化方案学习笔记(偏向锁,轻量级锁,自旋锁,重量级锁)

    目录 一,概述 二,CAS算法 三,Java对象的对象头,以及Mark Word 四,偏向锁 Baised Lock 五,轻量级锁 六,自旋锁 SpinLock 七,重量级锁 八,在应用层提高锁效率的 ...

  9. mysql 存储引擎的选择_MySQL学习笔记(四):存储引擎的选择

    一:几种常用存储引擎汇总表 二:如何选择 一句话:除非需要InnoDB 不具备的特性,并且没有其他办法替代,否则都应该优先考虑InnoDB:或者,不需要InnoDB的特性,并且其他的引擎更加合适当前情 ...

最新文章

  1. linux配置java环境变量(详细)
  2. 无中生有 : 对称方波中的二次谐波
  3. UVALive 4998 Simple Encryption
  4. Guava学习笔记:简化异常处理的Throwables类
  5. 【白皮书分享】2022年新品营销白皮书-阿里妈妈.pdf(附下载链接)
  6. 农业灌溉泵行业调研报告 - 市场现状分析与发展前景预测
  7. Windows批处理添加注释
  8. 【项目管理案例】第九期:如何做好项目整合管理
  9. 几款项目管理工具对比
  10. 微信提现报证书已过期
  11. 安装SQL Server 2017遇到“以前的某个安装需要重新引导计算机以便使更改生效”的问题
  12. Mac 上安装mysql
  13. react-native播放视频组件 react-native-video的用法
  14. Android开发板
  15. 灰色关联分析——供应商选择
  16. “佐藤可士和”的超整理术 整理真的可以让人愉悦
  17. Word2Vec原文翻译
  18. 2020.10.31文献2、3阅读:何川老师2篇文章《隧道穿越断层破碎带+地震》
  19. Linux深度学习进展笔记
  20. Android面试题之Service篇

热门文章

  1. 寒假每日一题(入门组)【week5 完结】
  2. 1113 Integer Set Partition (25 分)【难度: 一般 / 知识点: 思维 贪心】
  3. 用C语言输出一个字符串的所有子串
  4. JVM堆新生代分配比例
  5. Boostrap的按钮下拉菜单
  6. Nginx 入门到实战,新手必懂。
  7. 【Intellij IDEA系列】IDEA泛型处理Unchecked assignment:'java.util.Map' to 'java.util.Maplt;'
  8. Java源码解析:深入理解==和equals()
  9. 【JavaSE05】Java中方法与重载、递归-思维导图
  10. SpringMVC的表单标签库