事务是一组操作的集合,这些操作要么全部成功,要么全部失败,保证数据的一致性。它是数据库保证数据完整性的核心机制。
一、事务的四大特性(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.7 | repeatable read |
| mysql 8.0 | repeatable read |
mysql 的 repeatable read 通过 mvcc(多版本并发控制) 解决了幻读问题(在 innodb 引擎下)。
其他:
1、短事务优先,事务越短,锁持有时间越短,并发越高。
2、适当的隔离级别,根据业务需求选择最低的隔离级别。
3、避免事务中交互,不要在事务中等待用户输入。
到此这篇关于mysql 中的事务transaction详解的文章就介绍到这了,更多相关mysql事务transaction内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论