并发事务更新问题

简介: 并发事务更新问题

本文的所有内容基于 mysql InnoDB 和 sequelize。



问题



多个并发的事务对同一行数据进行更新,且更新的数据是基于这一行数据更新前的数据计算的结果,造成了此行数据更新的问题。



事务与锁简述



mysql 本身并不具有事务,事务是 InnoDB 引擎所有的功能,事务的隔离级别分为四种:


1、READ_UNCOMMITTED:脏读,一个事务能读到另一个事务未提交的数据,事务的隔离级别最低。


2、READ_COMMITTED:不可重复读,一个事务对一行数据进行更新的过程中,另一个事务对同一行数据进行读取,会在此行数据更新提交前后读取到不一致的结果。避免了脏读的情况,隔离级别比脏读略高一级。


3、REPEATABLE_READ:幻读,同一个事务内读取的数据是保证相同的,但当事务非独立执行时仍然会造成读取的结果不一致。默认的事务隔离级别,比不可重复读高一级。


4、SERIALIZABLE:序列化,事务的隔离级别最高,避免了上述的问题。


两种锁:


1、共享锁:读锁,获取共享锁的事务只能读,不能修改数据,多个事务可同时获取共享锁。


2、排他锁:写锁,一个事务获取写锁后可对数据进行读写,但其他事务无法再获取到写锁直到上一个事务完成。



sequelize 示例



解决方式:使用 SERIALIZABLE 事务隔离级别,但这并不够,我们仍然需要保证多个事务并发下读取的原始数据一定是之前事务提交更新之后的数据,因此还需要使用排他锁。


以下图片使用了 async/await 的写法,包含了事务的操作和 lock 锁的使用,仅供参考,sequelize 模型的定义可参考上一篇文章 -- 数据库时间类型数据的处理 ,不必深究具体的业务实现:



需要注意的是,使用排他锁时,如果查询操作不是根据主键或索引,那么会造成表锁,这会对数据库读写性能造成很大的影响,显然这并不是我想要的,我们更需要的是行锁,所以在使用排他锁时,应该使用主键或索引进行操作。



结语



除了在数据库层面上解决这个问题之外,还有另一种方法就是将这些操作同一行数据的并发事务改为串行执行。


另一个问题是 pm2 的集群模式下的并发事务会发生什么呢?

目录
相关文章
|
存储 NoSQL MongoDB
MongoDB如何创建数据库
MongoDB如何创建数据库
|
存储 JavaScript 前端开发
qml var类型详解
qml var类型详解
355 1
|
数据中心 Anolis
性能优化特性之:LSE指令集编译优化
本文介绍了倚天实例上的编译优化特性:LSE,并从优化原理、使用方法进行了详细阐述。
Alibaba Dragonwell 试用评测
Alibaba Dragonwell 8 是一款免费的 OpenJDK 发行版。它提供长期支持,包括性能增强和安全修复。Alibaba Dragonwell 8 目前支持 X86-64/Linux 平台,在数据中心大规模 Java 应用部署情况下, 可以大幅度提高稳定性、效率以及性能。
6429 0
|
IDE Java Shell
如何快速搭建一个 Spring Boot 项目?
Spring Boot 可以用最少的配置来快速创建一个独立的、生产级的 Spring 应用程序。 本文介绍如何快速搭建一个 Spring Boot「Hello World!」项目。
552 1
|
8月前
|
前端开发 JavaScript API
体育赛事即时比分 分析页面的开发技术架构与实现细节
本文基于“体育即时比分系统”开发经验总结,分享技术实现细节。系统通过后端(ThinkPHP)、前端(Vue.js)、移动端(Android/iOS)协同工作,解决实时比分更新、赔率同步及赛事分析展示等问题。前端采用 Vue.js 结合 WebSocket 实现数据推送,提升用户体验;后端提供 API 支持比赛数据调用;移动端分别使用 Java 和 Objective-C 实现跨平台功能。代码示例涵盖比赛分析页面、API 接口及移动端数据加载逻辑,为同类项目开发提供参考。
|
11月前
|
机器学习/深度学习 算法 前端开发
基于Python深度学习的果蔬识别系统实现
果蔬识别系统,主要开发语言为Python,基于TensorFlow搭建ResNet卷积神经网络算法模型,通过对12种常见的果蔬('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜')图像数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django框架搭建Web网页端可视化操作界面,以下为项目实现介绍。
211 4
基于Python深度学习的果蔬识别系统实现
天气预报-腾讯天气-7天-地址查询版免费API接口
这是一个免费的腾讯天气API接口,用于查询指定地址的7天天气预报。支持POST和GET请求方式。请求参数包括id、key、province、city、county等。返回参数包含日期、天气状况、温度等信息。 示例请求地址:https://cn.apihz.cn/api/tianqi/tengxun.php?id=88888888&key=88888888&province=四川省&city=绵阳市&county=。
|
SQL 监控 关系型数据库
深入解析MySQL死锁:原因、检测与解决方案
深入解析MySQL死锁:原因、检测与解决方案
|
Java Maven
【异常】java: Internal error in the mapping processor: java.lang.NullPointerException
【异常】java: Internal error in the mapping processor: java.lang.NullPointerException
1786 0