【自用】MySQL-事务

事务操作

正常的转账操作:

然而如果出现异常,如下图,执行到中文肯定会报错

但是此时会导致余额发生变化,如下图

所以需要使用事务,有两种方式

方式1:修改事务的提交方式

需要修改事务的提交方式

对于mysql,每一行都是一个事务,是自动提交的,可以使用select @@autocommit 查看,如果是1就是自动,需要设置成0,之后不管怎么操作数据,只有执行 commit; 才会真正修改数据,如果出现异常,可以是执行 rollback; 回滚,这样数据就不会改变了

补充:两个@代表查看系统变量信息

方式2:开启事务

不需要修改事务提交方式,而是在执行时加上一行代码即可,如下图。同样的,执行完后不会真正修改数据,只有 commit; 后才会修改,如果出现异常, rollback; 即可

四大特性ACID

并发事务问题

事务隔离级别

性能越上面越高,安全性越下面越强,✔代表可能会出现的并发事务问题

session为针对当前客户端窗口有效,global代表针对所有客户端窗口有效

read commit 解决脏读问题

注意下图右边的操作并没有commit,但是左边的客户端依然读取到了修改的数据,即脏读

因此将事务的隔离级别改成 read committed 即可解决,如下图,第一次select是初始,第二次是右边执行,第三次是右边提交,仅第三次才发生变化

repeatable read 解决不可重复读问题

同样的一个事务中,查询出来的数据不一致,就是不可重复读,即只要其中一个客户端进行提交,想要查询的客户端即使没提交,也会读到修改后的数据,如下图

左边第一次select为初始值,第二次为右边修改数据,此时采用的是read commit,因此在右边未提交时左边依旧没发生变化;第三次select则为右边执行了commit,此时左边查询到的结果已经改变,即在左边这个事务还没完成时,数据就发生了改变。

如下图,当设置为repeatable read时,右边直接一次性commit,可以看到左边多次select保持一致,只有当commit后,才能查询到修改后的数据,此时就可以完成重复读的操作

serializable 解决幻读问题

如下图,id为主键,初始并没有id为3的人员,左边先查,没有。与此同时,右边插入了一个id为3的人员并提交。此时左边再想插入id为3的人员,却提示已存在,然后通过select查询却发现id3为空,此时就出现了幻读问题

需要将事务的隔离级别设置为serializable解决

serializable为串行操作,即同一时刻只有一个事务能进行操作,只有a事务提交了,b事务才能继续

如下图,右边的客户端想要插入数据,然后由于左边的还没有提交,因此会堵塞在插入的环节

当右边的执行完所有操作(插入id4与右边客户端一致),并提交后,右边才会继续执行,同时因为左边已经插入了id4的人员,因此右边的会报错,如下图

相关推荐
我不会起名字32220 小时前
MySQL 8.0 迁移后 SQL 变慢:执行计划里 3 类被忽略的成本差异
mysql·explain·执行计划·索引下推·成本模型
楚识科技20 小时前
信创环境下 OCR 部署实践:从麒麟系统到达梦数据库的全栈适配
数据库·ocr
飞浪纪元[FWC–FE]20 小时前
Qt 构建排错实录:从 MSB 1009 到生成器选型
开发语言·数据库·qt
Paper数据分析-经管学术20 小时前
1985-2026年中国低空经济专利明细数据库
数据库
RuoyiOffice20 小时前
SpringBoot3 + openGauss:RuoYi Office 登录、流程发布与用印填报适配实战
java·数据库·spring boot·opengauss·信创
画中有画20 小时前
时序数据库在物联网系统中的应用
数据库·物联网·时序数据库
Decay__1 天前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
小徐不徐说1 天前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
论文复现现场1 天前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
Decay__1 天前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构