InnoDB 事务并发问题

devtools/2024/12/28 2:14:58/

1.并发问题发生场景

并发问题产生的原因是多个线程操作了同一条记录,可分为三种场景。

1.1读-读

即并发事务相继读取相同的记录。

读操作不会改变数据本身,因此并不会引起并发问题。

1.2写-写

即并发事务相继对相同的记录做出改动。

这种情况下会发生脏写,是无论如何都要避免的。所以在多个事务相继对同一条记录进行写操作的时候,需要让他们排队执行,这个过程是通过在内存中创建一个排他锁来实现的。

关于这个锁的结构本文不做赘述,可以参考 MySQL 锁概述。

1.3读-写

也就是一个事务进行读取操作,另一个进行改动操作,这种情况下可能发生脏读、不可重复读、幻读的问题。

这些问题有两种解决方案:

  • 方案一:MVCC + 锁

    在读已提交隔离级别下,MVCC 机制解决了脏读问题。

    在可重复读隔离级别下,MVCC 机制解决了脏读和不可重复读问题。

    在可重复读隔离级别下,MVCC 机制 + 间隙锁(或临键锁)解决了幻读问题。

  • 方案二:读写都加锁

​ 如果我们的一些业务场景不允许读取记录的旧版本,而是每次都必须去读取记录的最新版本,比方在银行存 款的事务中,你需要先把账户的余额读出来,然后将其加上本次存款的数额,最后再写到数据库中。在将账 户余额读取出来后,就不想让别的事务再访问该余额,直到本次存款事务执行完成,其他事务才可以访问账 户的余额。这样在读取记录的时候也就需要对其进行加锁操作,这样也就意味着读操作和写操作也像写-写操 作那样排队执行。

很明显,一般情况下采用 MVCC + 锁 的方式系统的并发度更高。


参考:《MySQL 是怎样运行的》


http://www.ppmy.cn/devtools/145989.html

相关文章

免费线上签字小程序,开启便捷电子签名

虽如今数字化飞速发展的时代,但线上签名小程序的开发制作却并非易事。需要攻克诸多技术难题,例如确保签名的真实性与唯一性,防止签名被伪造或篡改。 要精准地捕捉用户手写签名的笔迹特征,无论是笔画的粗细、轻重,还是…

android jetpack compose Model对象更新变量 UI不更新、不刷新问题

以前是搞老本行Android原生开发的,因为工作原因,一直在用vue小程序;因为一些工作需要,又需要用到Android原生开发,建了个项目,打开源码一看,天塌了!!!我以前的…

设计模式01:创建型设计模式之单例、简单工厂的使用情景及其基础Demo

一、单例模式 1.情景 连接字符串管理 2.好处 代码简洁:可全局访问连接字符串。性能优化:一个程序一个连接实例,避免反复创建对象(连接)和销毁对象(连接)。线程安全:连接对象不会…

【设计模式】装饰器模式(Decorator Pattern)

定义 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式。 装饰器模式通过创建一个装饰类&#xff0c;包装原始对象&#xff0c;并在保持原始对象接口不变的情况下&#xff0c;扩展其功能。 模式示例 #include <iostream> #include <strin…

详细对比JS中XMLHttpRequest和fetch的使用

在JavaScript中&#xff0c;XMLHttpRequest 和 fetch 是两种用于进行 HTTP 请求的 API。它们的主要区别在于设计理念、用法和功能支持。以下是两者的详细对比&#xff1a; 1. 语法与用法 XMLHttpRequest: 较老的 API&#xff0c;最早出现在 2000 年代。支持异步和同步请求&…

【开发问题记录】eslint9 中 eslint 和 prettier冲突

文章目录 1、引言2、问题复现3、问题修复4、注意5、eslint-plugin-prettier/recommended 与自己的默认规则&#xff0c;冲突解决 1、引言 eslint 和 prettier 这俩都是在前端工程化中不可缺少的东西&#xff0c;但这俩&#xff0c;在一块运行的时候&#xff0c;总会有点问题 Es…

TP5 动态渲染多个Layui表格并批量打印所有表格

记录&#xff1a; TP5 动态渲染多个Layui表格每个表格设置有2行表头&#xff0c;并且第一行表头在页面完成后动态渲染显示内容每个表格下面显示统计信息可点击字段排序一次打印页面上的所有表格打印页面上多个table时,让每个table单独一页 后端代码示例&#xff1a; /*** Nod…

每天40分玩转Django:Django表单集

Django表单集 一、今日学习内容概述 学习模块重要程度主要内容表单集基础⭐⭐⭐⭐⭐表单集定义、基本用法内联表单集⭐⭐⭐⭐⭐内联表单、关联数据表单集验证⭐⭐⭐⭐自定义验证、错误处理动态表单集⭐⭐⭐⭐动态添加删除表单 二、基本模型定义 # models.py from django.db…