MySQL的事务
MySQL 的 事务(Transaction) 是一组操作的集合,这些操作作为一个单一的单元执行,要么全部成功,要么全部失败。事务在保证数据一致性和完整性方面发挥着重要作用,尤其在并发环境下确保数据的安全性和准确性。
事务的四大特性:ACID
-
原子性(Atomicity):
- 事务中的操作要么全部执行,要么全部不执行。即使发生错误或中断,事务所做的部分操作也不会被提交,整个事务会被回滚。
- 例子:银行转账操作,若一个操作失败(如余额更新),则整个操作会回滚,不会部分成功。
-
一致性(Consistency):
- 事务开始前和结束后,数据库必须处于一致的状态。事务中的操作必须保持数据库的完整性约束。
- 例子:转账操作前后,账户的总余额应始终相等。
-
隔离性(Isolation):
- 一个事务的执行不应受其他事务干扰,每个事务都应像独立运行一样。MySQL 提供了不同级别的隔离性来控制事务之间的干扰。
- 例子:在一个事务完成前,其他事务无法看到中间的修改(视事务隔离级别而定)。
-
持久性(Durability):
- 一旦事务被提交,对数据库的修改就是永久性的,即使系统崩溃也能保证数据不会丢失。
- 例子:当银行的转账事务提交后,即使数据库崩溃,转账结果仍然会被保留。
事务控制语句
MySQL 提供了几种基本的事务控制语句,用于管理事务的开始、提交和回滚。
-
START TRANSACTION 或 BEGIN:
- 启动一个新的事务。
- 事务开始后,可以执行一系列的数据库操作。
START TRANSACTION; -- 或者 BEGIN; -
COMMIT:
- 提交当前事务,所有的修改将会被保存到数据库中。
COMMIT; -
ROLLBACK:
- 回滚当前事务,撤销在当前事务中执行的所有操作。
ROLLBACK; -
SAVEPOINT 和 ROLLBACK TO SAVEPOINT:
- 用于在事务内设置一个保存点,可以回滚到某个保存点,而不是回滚整个事务。
SAVEPOINT my_savepoint; -- 在事务中的某个地方回滚到保存点 ROLLBACK TO SAVEPOINT my_savepoint;
事务的隔离级别
MySQL 提供了四种事务隔离级别,用来控制事务之间的可见性和干扰程度:
-
READ UNCOMMITTED(读取未提交):
- 一个事务可以读取另一个事务未提交的数据,可能会导致脏读(dirty read)。
- 最低级别,性能较高,但可能导致数据不一致。
-
READ COMMITTED(读取已提交):
- 事务只能读取已经提交的事务的数据,避免了脏读,但可能发生不可重复读(non-repeatable read)。
-
REPEATABLE READ(可重复读):
- 确保事务在执行过程中多次读取相同的数据时结果一致,避免了脏读和不可重复读,但可能会发生幻读(phantom read)。
- MySQL 的默认隔离级别。
-
SERIALIZABLE(串行化):
- 最强的隔离级别,事务串行执行,完全避免脏读、不可重复读和幻读,但会显著降低性能。
- 在这个级别下,事务执行时会加锁,防止其他事务同时访问数据。
-- 设置隔离级别 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
事务的锁机制
MySQL 在事务处理中使用了不同类型的锁来保证数据一致性和并发控制。常见的锁类型包括:
-
共享锁(S 锁):
- 允许其他事务读取数据,但不能修改数据。
- 常用于
SELECT ... FOR SHARE
查询。
-
排他锁(X 锁):
- 只有当前事务能读取和修改数据,其他事务无法访问该数据。
- 常用于
SELECT ... FOR UPDATE
查询。 - 当事务对某一行数据执行 UPDATE、DELETE 或 INSERT 操作时,会自动为该行加上排他锁。
-
意向锁(Intention Lock):
- 用于表级锁,指示事务将在某些行上请求共享锁或排他锁。
事务示例
假设有两个账户表 accounts
,我们要在一个事务中完成资金的转移。
-- 开始事务 START TRANSACTION; -- 从账户 A 中扣款 UPDATE accounts SET balance = balance - 100 WHERE id = 1; -- 向账户 B 中存款 UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- 提交事务 COMMIT;
如果在这个过程中发生任何错误,可以使用 ROLLBACK
回滚事务,撤销所有的修改。
事务的自动提交
MySQL 默认启用自动提交模式(autocommit),即每一条 SQL 语句都会被自动提交作为一个独立的事务。如果你希望手动控制事务,可以禁用自动提交模式。
-- 禁用自动提交 SET autocommit = 0; -- 启用自动提交 SET autocommit = 1;
死锁(Deadlock)
在并发事务的情况下,如果两个或多个事务相互等待对方释放锁,可能导致死锁。MySQL 会自动检测到死锁,并回滚其中一个事务,以解除死锁。
死锁示例:
- 事务 A 锁定了表
accounts
的一行,准备更新。 - 事务 B 锁定了表
accounts
的另一行,准备更新。 - 事务 A 等待事务 B 提交,事务 B 等待事务 A 提交,形成死锁。
MySQL 会自动检测并回滚其中一个事务,解除死锁。
总结
- 事务确保数据的一致性、可靠性和并发控制。
- 通过
START TRANSACTION
、COMMIT
和ROLLBACK
来显式控制事务的执行。 - 事务支持四种隔离级别,确保事务之间的可见性。
- 事务使用不同的锁来控制并发操作,防止冲突和数据不一致。
了解事务的原理和操作,可以帮助你更好地设计数据库应用,确保数据的安全性和高效性。
注意:该内容由由AIGC提供。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!