当前位置: 首页 > news >正文

MySql并发事务问题

 事务


事务概念:

        事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

事务的特性:ACID:

小结:

ACID,分别指的是:原子性、一致性、隔离 性、持久性;

举个例子:

A向B转账500,转账成功,A扣除500元,B增加500元,原子操作体现在要么都成功,要么都失败

在转账的过程中,数据要一致,A扣除了500,B必须增加500

在转账的过程中,隔离性体现在A像B转账,不能受其他事务干扰

在转账的过程中,持久性体现在事务提交后,要把数据持久化(可以说是落盘操作)

并发事务问题

并发事务概念:

并发事务是指在数据库系统中,多个事务同时对数据进行读写和修改的过程。

并发事务问题:

1.脏读 (违反了事务的隔离性)

例:事务A先查询id为1的数据,再修改id为1的数据。修改完以后事务A还没提交,这时候事务B也来查询id为1的数据,但这时候事务B已经可以读到A修改完的数据了。这就是脏读。(如果A事务回滚,但B已经读到了A修改的数据,造成了数据不一致)

2.不可重复读 (违反了事务的一致性)

例:事务A先查询id为1的数据,再执行某个逻辑。这时事务B修改id为1的数据。事务A再去查询id为1的数据,却和之前不一样了!简单来说就是:在同一个事务内,查询两次同一条数据,却出现不同结果!

3.幻读 (违反了事务的隔离性)(在已经解决了不可重复读的基础上)

例:事务A查询id为1的数据,发现数据库中没有。这个时候事务B来了,正好往数据库中插入了一条id为1的数据并且提交了事务。这个时候,事务A进行插入操作,就直接报错了:里面已经有了id为1的数据(假设我们已经解决了不可重复读的问题)。但A再次进行查询,查询结果和第一次一样,发现还是没有id为1的数据,但插入就是报错,这就是幻读的问题。

注意:幻读是在解决了不可重复读的基础上,不可重复读是读取了其他事务更改的数据,针对update操作;幻读是读取了其他事务新增的数据,针对insert和delete操作。

解决方案:

注:这里✔表示存在该问题,× 表示解决该问题。

小结

1.事务并发问题:

        第一是脏读, 当一个事务正在访问数据并且对数据进行了修改,而这种修改 还没有提交到数据库中,这时另外一个事务也访问了这个数据,因为这个数 据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依 据“脏数据”所做的操作可能是不正确的。

        第二是不可重复读:比如在一个事务内多次读同一数据。在这个事务还没有 结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之 间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。 这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重 复读。

         第三是幻读(Phantom read):幻读与不可重复读类似。它发生在一个事务 (T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在 随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就 好像发生了幻觉一样,所以称为幻读。

2.事务隔离:

        第一个是,未提交读(read uncommitted)它解决不了刚才提出的所有问 题,一般项目中也不用这个。

        第二个是读已提交(read committed)它能解 决脏读的问题的,但是解决不了不可重复读和幻读。

        第三个是可重复读 (repeatable read)它能解决脏读和不可重复读,但是解决不了幻读,这个 也是mysql默认的隔离级别。

        第四个是串行化(serializable)它可以解决刚 才提出来的所有问题,但是由于让是事务串行执行的,性能比较低。所以, 我们一般使用的都是mysql默认的隔离级别:可重复读。

相关文章:

  • winform datagridView 一次删除20000条数据
  • SpringBoot快速入门笔记(5)
  • GPT提示词分享 —— 中医
  • mysql中表的设计
  • 帝国CMS模板源码整站安装说明(图文)
  • APIFY集成客服系统:提升用户运营效率
  • 技术 SEO 初学者指南
  • hadoop:案例:将顾客在京东、淘宝、多点三家平台的消费金额汇总,然后先按京东消费额排序,再按淘宝消费额排序
  • 详解 Redis 在 Centos 系统上的安装
  • STM32为什么不能跑Linux?
  • Linux、Docker、Brew、Nginx常用命令
  • 高新技术企业上市要达到什么条件
  • Linux入门攻坚——18、SELinux、Bash脚本编程续
  • hive-分桶-索引(初篇)
  • 【DevOps工具篇】Keycloak安装配置及脚本化
  • Git同步原始仓库到Fork仓库中
  • HashMap剖析之内部结构
  • HTTP中GET与POST的区别 99%的错误认识
  • iOS编译提示和导航提示
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Netty源码解析1-Buffer
  • PHP面试之三:MySQL数据库
  • sessionStorage和localStorage
  • Shell编程
  • windows下mongoDB的环境配置
  • 大整数乘法-表格法
  • 给初学者:JavaScript 中数组操作注意点
  • 简单数学运算程序(不定期更新)
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 网络应用优化——时延与带宽
  • 微服务框架lagom
  • 原生 js 实现移动端 Touch 滑动反弹
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​2021半年盘点,不想你错过的重磅新书
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • (4.10~4.16)
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (LeetCode 49)Anagrams
  • (pytorch进阶之路)扩散概率模型
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (力扣)1314.矩阵区域和
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (十一)手动添加用户和文件的特殊权限
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .Net Redis的秒杀Dome和异步执行
  • .net web项目 调用webService
  • .NET 读取 JSON格式的数据
  • .NET 反射 Reflect
  • @Pointcut 使用
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [ARM]ldr 和 adr 伪指令的区别