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

【MySQL笔记】事务的ACID特性与隔离级别

目录

  • 1. 什么是事务?
  • 2. 事务的ACID特性
  • 3. 事务控制语法
  • 4. 隔离级别与并发问题

1. 什么是事务?

事务(Transaction)是由一组SQL语句组成的逻辑单元,这些操作要么全部成功,要么全部失败。
案例——银行转账:
在这里插入图片描述
转账成功: 张三给李四转100元,转账之前张三和李四的总额是1000+1000=2000,转账之后张三和李四的总额是900+1100=2000,这是正确的结果;
转账失败: 如果在转账的过程中张三的余额减了100 之后服务器崩溃了,李四的余额没有 加100,最终两个人的余额之和是900+1000=1900;

2. 事务的ACID特性

特性说明
原子性(Atomicity)事务内操作要么全成功,要么全失败
一致性(Consistency)事务前后数据完整性不变 (如转账总额守恒)
隔离性(Isolation)并发事务相互隔离,防止数据干扰
持久性(Durability)事务提交后数据永久存储

3. 事务控制语法

-- 1. 开启事务(两种方式)
START TRANSACTION; 
BEGIN;-- 2. 设置保存点
SAVEPOINT savepoint1;-- 3. 提交/回滚
COMMIT;       -- 提交
ROLLBACK;     -- 回滚
ROLLBACK TO savepoint1; -- 回滚到保存点-- 4. 自动提交设置
SET autocommit = 0; -- 关闭自动提交(默认=1开启)

注意:

  • 已提交的事务不可回滚
  • 自动提交模式下,一条SQL就是一个事务
  • 显式开启事务时(BEGIN后),必须手动COMMIT

4. 隔离级别与并发问题

MySQL支持4种隔离级别 (从上到下安全性⬆️ 并发性(性能)⬇️)

隔离级别脏读不可重复度幻读
READ UNCOMMITTED (读未提交)
READ COMMITTED (读已提交)
REPEATABLE READ (可重复度(默认))
SERIALIZABLE (串行化)

MySQL 的 InnoDB 存储引擎中通过 Next-Key 锁部分解决幻读问题

  1. 脏读:事务 A 读取了事务 B 未提交的数据
    • 例:B 修改数据中途崩溃,A 读到中间状态的数据
  2. 不可重复读:同事务内两次读取结果不同(数据值变化
    事务ADB事务B读取数据X=100修改X=200并提交再次读取X=200事务ADB事务B
  3. 幻读 :想通的查询条件两次返回数据的行数不同
    • 例:A 查询余额 >500 的账户,期间 B 新增满足条件的账户

生产建议:
MySQL 默认 REPEATABLE READ 在多数场景下平衡性能与安全
金融系统可考虑 SERIALIZABLE ,但需测试性能影响
谨慎使用 READ UNCOMMITTED(仅适用于可容忍脏读的场景)

http://www.xdnf.cn/news/15299.html

相关文章:

  • 详细理解向量叉积
  • 二分搜索 (左程云)
  • 【C/C++】编译期计算能力概述
  • uniapp弹出手机键盘,布局被顶飞,导致页面混乱问题
  • 使用Pycharm集成开发工具远程调试部署在虚拟机上的flask项目:超级详细的完整指南
  • Rust Web 全栈开发(六):在 Web 项目中使用 MySQL 数据库
  • Transforms
  • 单向链表反转 如何实现
  • JVM的垃圾回收算法和多种GC算法
  • Redis面试精讲 Day 1:Redis核心特性与应用场景
  • Day59
  • JavaWeb(苍穹外卖)--学习笔记05(MD5)
  • 2D转换之缩放scale
  • Cursor创建Spring Boot项目
  • 关于赛灵思的petalinux zynqmp.dtsi文件的理解
  • 网络连接:拨号连接宽带PPPOE
  • 使用 Java 开发大数据应用:Hadoop 与 Java API 的结合
  • Golang 面向对象(封装、继承、多态)
  • Eureka实战
  • Git企业级开发(多人协作)
  • 【设计模式】装饰(器)模式 透明装饰模式与半透明装饰模式
  • Java生产带文字、带边框的二维码
  • Flink创建执行环境的三种方式,也是Flink搭建程序的第一步
  • React 组件中怎么做事件代理?它的原理是什么?
  • MyBatis实现分页查询-苍穹外卖笔记
  • openGauss数据库管理实战指南——基本常用操作总结
  • Sentry 集成
  • 【王树森推荐系统】行为序列02:DIN模型(注意力机制)
  • 【LeetCode453.最小操作次数使数组元素相等】
  • 深入解析C#接口实现的两种核心技术:派生继承 vs 显式实现