当前位置: 代码网 > it编程>数据库>Mysql > MySQL 中的事务Transaction详解

MySQL 中的事务Transaction详解

2026年08月21日 Mysql 我要评论
事务是一组操作的集合,这些操作要么全部成功,要么全部失败,保证数据的一致性。它是数据库保证数据完整性的核心机制。一、事务的四大特性(acid)特性含义解释原子性(atomicity)要么全部成功,要么

事务是一组操作的集合,这些操作要么全部成功,要么全部失败,保证数据的一致性。它是数据库保证数据完整性的核心机制。

一、事务的四大特性(acid)

特性含义解释
原子性(atomicity)要么全部成功,要么全部失败转账:扣钱和加钱必须同时成功或同时失败
一致性(consistency)事务前后数据状态一致转账前后总金额不变
隔离性(isolation)事务之间互不干扰两个事务同时操作同一数据时,互相不可见
持久性(durability)事务提交后数据永久保存提交后即使系统崩溃,数据也不会丢失

二、事务的基本操作

1. 控制事务的 sql 语句

语句作用
start transaction / begin开始一个事务
commit提交事务,将修改永久保存
rollback回滚事务,撤销所有修改
savepoint name设置保存点
rollback to savepoint name回滚到指定保存点
release savepoint name删除保存点

2. 基本使用

-- 开始事务
start transaction;
-- 执行操作
update accounts set balance = balance - 100 where id = 1;
update accounts set balance = balance + 100 where id = 2;
-- 检查结果
select * from accounts;
-- 提交事务(确认修改)
commit;
-- 或回滚事务(撤销修改)
-- rollback;

3. 带保存点的事务

start transaction;
-- 操作1
update accounts set balance = balance - 100 where id = 1;
-- 设置保存点
savepoint sp1;
-- 操作2(可能失败)
update accounts set balance = balance + 100 where id = 2;
-- 如果操作2失败,回滚到保存点
rollback to savepoint sp1;
-- 操作3
update accounts set balance = balance + 100 where id = 3;
-- 提交事务
commit;

三、事务隔离级别

1. 隔离级别

隔离级别脏读不可重复读幻读并发性能
read uncommitted可能可能可能最高
read committed不会可能可能中等
repeatable read不会不会可能较低
serializable不会不会 不会最低

2. 查看和设置隔离级别

-- 查看当前隔离级别
select @@transaction_isolation;
-- 或
show variables like 'transaction_isolation';
-- 设置全局隔离级别
set global transaction_isolation = 'read-committed';
-- 设置当前会话隔离级别
set session transaction_isolation = 'read-committed';

四、隔离级别的并发问题

1. 脏读(dirty read)

一个事务读取了另一个未提交事务的数据。

时间线:
事务a:begin → 修改数据 → (未提交)
事务b:begin → 读取数据 → 读到了事务a未提交的数据(脏读)
事务a:rollback(撤销修改)

2. 不可重复读(non-repeatable read)

同一事务内,两次读取同一数据结果不同。

时间线:
事务a:begin → 读取数据 → 结果=100
事务b:begin → 修改数据 → 提交
事务a:再次读取数据 → 结果=200(和第一次不一样)

3. 幻读(phantom read)

同一事务内,两次查询结果集的行数不同。

时间线:
事务a:begin → 查询所有用户 → 查到10条
事务b:begin → 插入新用户 → 提交
事务a:再次查询所有用户 → 查到11条(多了1条,像幻觉一样)

五、默认隔离级别

版本默认隔离级别
mysql 5.7repeatable read
mysql 8.0repeatable read

mysql 的 repeatable read 通过 mvcc(多版本并发控制) 解决了幻读问题(在 innodb 引擎下)。

其他:

  1、短事务优先,事务越短,锁持有时间越短,并发越高。

  2、适当的隔离级别,根据业务需求选择最低的隔离级别。

  3、避免事务中交互,不要在事务中等待用户输入。

到此这篇关于mysql 中的事务transaction详解的文章就介绍到这了,更多相关mysql事务transaction内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com