本文作者:裘维清,腾讯高级运营开发工程师,主要负责腾讯游戏的运营开发工作。

本文针对我们平时使用场景最多的MySQL数据库在RR隔离级别下容易产生幻读的问题,来进行分析并分享解决方案。

PartⅠ 问题回顾

幻读的定义:幻读是指某个事务读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前事务再次读取该范围内的记录时就会产生幻行。

举一个例子,user表中id是主键索引,T1是主事务:

T2是干扰事务:

Step1:T1开始,并检查user表中是否有id=1的记录。

Step2:T2开始,插入id为1的记录且成功执行。

Step3:T1查到没有id=1的记录就开始插入id=1的记录,但是失败了(主键冲突)。

Step4:T1不能接受现实又查了一遍是否存在id=1的记录,发现的确没有,彻底崩溃...

从第四步我们可以看出,在主事务执行commit之前,不管再查多少次,都无法获取到id=1的这条记录,因为此时它已经产生幻读了。

Part Ⅱ 解决方案

要解决幻读的问题有两种方案,一种是采用SERIALIZABLE 数据隔离级别,但是这种方案会强制把所有事务排序,来达到事务之间不互相冲突产生幻读的问题,当事务并发高的时候,很容易产生大量超时和锁竞争的情况,所以一般不太建议采用这种方案。另一种方案是采用在RR数据隔离级别下,手动给select操作加上x锁(排它锁)或者s锁(共享锁),下面就具体介绍一下x锁和s锁。

1. 什么是共享锁和排它锁

共享锁(SELECT ... LOCK IN SHARE MODE)即一个事务获取一条记录共享锁的同时,其他事务也可以获得这条记录的共享锁,但是如果同时有多个事务获得这条记录的共享锁,谁也无法修改这条记录,直到都释放掉共享锁,只剩下一个事务拥有这条记录的锁为止。

排它锁(SELECT ... FOR UPDATE)即一个事务获得了一条记录的排它锁的同时,其他事务就不能获得这条记录的共享锁和排它锁,也无法修改这条记录,直到这个事务释放掉锁为止。

2. 相同点和不同点

相同点:一个事务在获得一条记录的共享锁或者排它锁的同时,其他事务都不能修改这条记录,直到这个事务释放掉锁为止。

不同点:排它锁比共享锁多阻塞了其他事务对相同记录的共享锁,但是不影响快照读。

3. 举例说明

共享锁:

排它锁:

Part Ⅲ 应用场景

结合我们平常的营销活动,这里分别举一个例子加以说明。

共享锁举例:

譬如一个工会活动,我们会设计一张存放工会信息的总表teamInfo,还会设计一张存放操作工会日志的表teamLog,当用户操作工会的时候,我们如果直接insert一条日志到日志表,其实是有一定的风险的,如果这时会长删除了工会,那么就可能出现数据不一致的情况,所以我们在插入数据时先select * from teamInfo where teamId = xx lock in share mode;再insert into teamLog xxxxxxx;这样就可以了。

排它锁举例:

譬如我们常见的秒杀活动,一般秒杀活动参与秒杀的物品都是有数量限制的,我们在判断用户是否能购买时会判断,是否物品还有剩余,有剩余的情况下再把剩余数量减1,具体sql为1.select * from goods where id = xxx;2.update num = num-1 from goods where id = xxx;当多个事务并发的时候就会出现秒杀物品超卖的情况。如果我们改成select * from goods where id = xxx for update;这样就可以了(这种用法的性能不是很高,这里只是举例排它锁的使用场景,使用时要考虑具体场景是否适合用)。

Part Ⅳ 总结

那共享锁和排它锁是否能互相代替呢,这要看具体的场景,像上面两个例子就不行,第一个例子如果用了排它锁就会造成一个用户在操作工会的时候,其他用户就不能获取这条记录共享锁的情况。第二个例子如果使用共享锁的话,其他事务都能获得goods表这条记录的共享锁,会导致谁也更新不了剩余数量这个值的情况。所以共享锁和排它锁都有各自的作用,不能互相替代。

特惠体验云数据库

MySQL数据库特惠_云数据库MySQL优惠_MySQL云数据库活动 - 腾讯云​cloud.tencent.com

两个jqgrid 直接互相数据_MySQL数据库锁应该这样用相关推荐

  1. mysql数据锁的类型_MySQL数据库锁类型

    锁概念: 当高并发访问同一个资源时,可能会导致数据不一致,需要一种机制将用户访问数据的顺序进行规范化,以保证数据库数据的一致性.锁就是其中的一种机制. 一个栗子 :以买火车票为例,火车票可面向广大消费 ...

  2. mysql 数据库表被锁住了_mysql数据库锁的产生原因及解决办法

    数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性 ...

  3. mysql数据库什么情况下会锁表_mysql数据库锁的产生原因及解决办法

    数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性 ...

  4. mysql scrapy 重复数据_mysql数据库如何处理重复数据?

    前言 前段时间,很多人问我能不能写一些数据库的文章,正好自己在测试mysql数据库性能的时候,出现了一个问题,也就是出现了很多重复的数据,想起来自己long long ago写过一篇类似的,仅此就拿来 ...

  5. mybatisplus 操作另一个数据库的数据_MySQL数据库的基础操作

    一.基本概念 数据库术语 数据库(database) - 保存有组织的数据的容器(通常是一个文件或一组文件). 数据表(table) - 某种特定类型数据的结构化清单. 模式(schema) - 关于 ...

  6. mysql修改级联表数据_MySQL数据库 外键,级联, 修改表的操作

    1.外键: 用来建立两张表之间的关系 - 一对多 - 多对多 - 一对一 研究表与表之间的关系: 1.定义一张 员工部门表 id, name, gender, dep_name, dep_desc - ...

  7. mysql 处理数据_MySQL数据库,如何处理重复的数据?

    前言 这是一个基本问题,这篇文章是我很早之前遇到的一种情况,后来在学习视频的时候又遇到了一次,因此给出一个总结.其实解决能否插入重复数据的问题,一般情况下是有两个思路,就像治水一样,第一个就是从源头, ...

  8. mysql自动同步数据_MySQL数据库实现双向自动同步

    [IT168 技术]本文将探讨如何通过MySQL数据库的高级特性,实现数据库的双向自动同步,确保数据的冗余与完整性.通过以往真实的项目实战与经验,把操作实施过程全部记录下来,主要有以下几个主要内容. ...

  9. elastic如何和mysql同步数据_MySQL数据库之mysql 同步数据到 ElasticSearch 的方案

    本文主要向大家介绍了MySQL数据库之mysql 同步数据到 ElasticSearch 的方案 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. MySQL Binlog 要通过 ...

最新文章

  1. linux 文件IO与内存映射:内存映射
  2. vs2008 外部调用ActiveX控件接口方法
  3. Matlab与线性代数 -- 稀疏矩阵的图形显示
  4. python安装pyqt5 qml_PyQt5:PyQt5程序打包2
  5. python红色的颜色表达式_50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)...
  6. 初次就这么给了你(Django-rest-framework)
  7. linux下配置squid 服务器,最简单使用方式
  8. 使用WMI和性能计数器监控远程服务器权限设置
  9. 视频截取图片帧工具(可免费使用)
  10. html img标签的alt属性和title属性(说明)
  11. 函数:计算字符串中大写字母的个数
  12. 【渝粤教育】国家开放大学2018年秋季 2129T药物化学 参考试题
  13. PNP和NPN磁感应开关有什么区别
  14. 《App研发录》读书笔记
  15. windows7下cmd命令窗口没有滚动条的解救方法
  16. Office基础操作:Word 使用交叉引用的超链接后,如何一步操作返回至引用处
  17. jquery实现二级导航下拉菜单效果实例
  18. 【DOTS学习笔记】从第一个Jobs程序入门
  19. SEO像艺术,为自己做站最划算
  20. 使用sizeof()计算结构体大小

热门文章

  1. Python编写只允许实例化一个对象的类
  2. matlab生成exe失败,求助,m文件生成exe遇到的错误
  3. linux下c语言scanf,C语言输入scanf
  4. android+adb+push到系统下,Android adb push 应用到app/system
  5. 力扣19,删除链表的倒数第n个节点(JavaScript)
  6. ncl 添加点shp文件_一:python读取shapefile文件
  7. html5窗口播放插件,基于jQuery UI的模拟windows窗口插件
  8. vbe代码对齐插件_写代码需要注意的问题
  9. 郑州轻工业学校计算机网络,计算机网络期末考试a卷(郑州轻工业学院).doc
  10. leetcode刷题:二叉树的中序遍历