MySQL的事务隔离级别实战
SQL规范定义的事务隔离级别,数据库具体实现可能存在差异。 MySQL中,默认事务隔离级别为可重复读时不会锁住读取到的行。 读已提交时,写操作会锁住相应行。 可重复读时,索引列为条件的更新可能导致间隙锁问题。 串行化时,读写操作会锁住整张表。
发布日期:2025-04-18 09:52:22
浏览次数:63
分类:精选文章
本文共 1449 字,大约阅读时间需要 4 分钟。
事务的基本要素(ACID)及其并发问题
事务的基本要素(ACID)
事务是数据库操作的基本单元,确保数据的完整性和一致性。ACID(原子性、一致性、隔离性、持久性)是事务管理的四个核心要素。
1. 原子性(Atomicity)
事务执行过程中,要么全部完成,要么全部回滚。例如,银行转账必须确保资金从A账户转移到B账户,否则会导致经济损失。数据库系统会记录所有操作,确保事务的原子性。
2. 一致性(Consistency)
事务执行前后,数据库状态不会出现不一致。例如,A向B转账后,A的钱减少,B的钱增加,这种状态必须保持一致。
3. 隔离性(Isolation)
同一时间,同一数据只能被一个事务操作。例如,A正在从一张银行卡取钱时,B不能立即修改这张卡的数据。
4. 持久性(Durability)
事务完成后,所有修改会被永久保存到数据库,防止数据丢失。
事务并发问题
1. 脏读(Dirty Read)
事务A读取了事务B尚未提交的数据,但事务B回滚后,A仍然看到B的数据。这会导致数据不一致。
2. 不可重复读(Non-Repeatable Read)
事务A多次读取同一数据时,由于事务B在A读取期间修改了数据,A可能多次读到不同的结果。
3. 幻读(Phantom Read)
事务A执行查询时,发现数据状态与事务A之前的查询结果不一致。这是由于事务B在A查询期间插入或删除了数据。
小结
不可重复读和幻读容易混淆。不可重复读侧重于修改操作,而幻读侧重于新增或删除操作。解决不可重复读的方法是锁住相关行,解决幻读需要锁表。
MySQL事务隔离级别
1. 读未提交(Read Uncommitted)
- 脏读:是
- 不可重复读:是
- 幻读:是
2. 读已提交(Read Committed)
- 脏读:否
- 不可重复读:是
- 幻读:是
3. 可重复读(Repeatable Read)
- 脏读:否
- 不可重复读:否
- 幻读:是
4. 串行化(Serializable)
- 脏读:否
- 不可重复读:否
- 幻读:否
默认事务隔离级别
MySQL默认事务隔离级别为可重复读(Repeatable Read)。
事务隔离级别示例
1. 读未提交示例
- 客户端A设置事务模式为
read uncommitted,查询表。 - 在A提交事务之前,客户端B更新表。
- B事务未提交,但A可以读到B的脏数据。
2. 读已提交示例
- 客户端A设置事务模式为
read committed。 - 在A提交事务之前,客户端B更新表。
- B提交事务后,A可以读到最新数据,避免了脏读。
3. 可重复读示例
- 客户端A设置事务模式为
repeatable read。 - 在A提交事务之前,客户端B更新表并提交。
- A读取数据时,看到的数据与B提交前一致,避免了不可重复读。
4. 串行化示例
- 客户端A设置事务隔离级别为
serializable。 - 客户端B在相同隔离级别下尝试插入数据,操作会失败,因表被锁。
补充说明
对于大多数应用程序,推荐将数据库隔离级别设置为Read Committed,它能避免脏读,同时具有较好的并发性能。对于可能出现不可重复读或幻读的场景,可以通过应用程序使用悲观锁或乐观锁来控制并发问题。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2026年06月08日 19时43分56秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
php数组实现:哈希 +双向链表
2023-03-01
PHP数组排序函数array_multisort()函数详解(二)
2023-03-01
php数组的几个函数和超全局变量
2023-03-01
PHP文件上传详解
2023-03-01
PHP文件锁
2023-03-01
php文本框输入制定文本,php – 当用户没有向文本框输入任何内容时...
2023-03-01
PHP时间戳和日期相互转换操作总结
2023-03-01
php时间戳知识点,php 时间戳函数总结与示例
2023-03-01
php更新数据库失败,php – 无法更新MySQL数据库
2023-03-01
php机器人聊天对话框,基于AIML的PHP聊天机器人
2023-03-01
PHP查找数组中最大值与最小值
2023-03-01
php查最大值,在PHP数组中查找最大值
2023-03-01
php根据年月日计算年龄
2023-03-01
RabbitMQ - 单机部署(超详细)
2023-03-01
php检查注册,PHP检查注册的电子邮件地址是一个’school.edu’地址
2023-03-01
php模拟发送GET和POST请求
2023-03-01
RabbitMQ - 以 MQ 为例,手写一个 RPC 框架 demo
2023-03-01
php模板引擎smarty
2023-03-01
php正则表达式模式
2023-03-01