目录
MySQL 事务概述
事务(Transaction)是一组数据库操作的集合,要求这些操作要么全部成功,要么全部失败。事务提供了对数据操作的原子性、隔离性、一致性和持久性(即 ACID 特性)。通过事务,可以确保数据的完整性和一致性,特别是在多个数据库操作需要一起执行时。
在 MySQL 中,事务主要用于涉及多个 SQL 操作的场景,以保证数据的一致性和正确性。
事务的ACID特性
MySQL 事务遵循 ACID 原则,确保数据在多个操作中始终保持一致性。
- A (Atomicity):原子性。事务中的所有操作要么全部成功,要么全部失败,不能部分成功,保证了事务的“全有或全无”特性。
- C (Consistency):一致性。事务的执行必须使数据库从一个一致性状态变到另一个一致性状态。
- I (Isolation):隔离性。多个事务并发执行时,一个事务的操作不会影响到其他事务的执行。
- D (Durability):持久性。事务一旦提交,对数据库的改变是永久性的,即使系统崩溃也能保证数据的持久化。
MySQL 事务的开始与提交
开始事务
在 MySQL 中,可以使用 START TRANSACTION
或 BEGIN
来显式地开始一个事务。事务的开始标志着数据库状态的开始。事务开始后,所有的操作都将被包含在事务中,直到提交或回滚。
示例:开始一个事务
START TRANSACTION;
或
BEGIN;
提交事务
提交事务使用 COMMIT
语句。COMMIT
会将事务中的所有操作永久保存到数据库中,并使事务结束。
示例:提交事务
COMMIT;
提交后,所有在事务中的修改都将永久保存到数据库。
MySQL 事务的回滚
如果在事务过程中发生错误,可以使用 ROLLBACK
来撤销事务中的所有操作,使数据库回到事务开始时的状态。回滚操作撤销了事务中的所有更改。
示例:回滚事务
ROLLBACK;
ROLLBACK
会撤销事务内的所有修改,确保数据的一致性。
MySQL 自动提交模式
默认情况下,MySQL 使用自动提交模式,即每一条 INSERT
、UPDATE
或 DELETE
等操作都会自动提交。也就是说,每执行一次语句,MySQL 都会自动为其提交事务。
关闭自动提交模式
如果希望显式地控制事务,可以通过关闭自动提交模式来手动管理事务。使用 SET autocommit = 0;
来关闭自动提交模式。
示例:关闭自动提交
SET autocommit = 0;
此时,必须显式使用 COMMIT
提交事务,否则数据库操作将不会持久化。
开启自动提交模式
如果希望恢复自动提交模式,可以通过 SET autocommit = 1;
来开启。
示例:开启自动提交
SET autocommit = 1;
在开启自动提交模式下,每次执行 SQL 操作都会立即提交。
隔离级别与事务锁
MySQL 支持事务的 隔离级别,以确保事务之间的数据操作不会互相干扰。事务的隔离性由不同的隔离级别来定义,MySQL 支持四种标准的隔离级别:
- READ UNCOMMITTED:最低的隔离级别,一个事务可以读取其他事务未提交的数据(脏读)。这种隔离级别容易导致数据的不一致。
- READ COMMITTED:事务只能读取其他事务已提交的数据(避免脏读)。但是,可能会出现不可重复读的问题。
- REPEATABLE READ:默认的隔离级别,事务可以多次读取同一数据,保证在事务开始后到提交前的数据一致性(防止脏读和不可重复读)。但可能会出现幻读。
- SERIALIZABLE:最高的隔离级别,事务之间完全隔离,每次只能一个事务访问数据,避免脏读、不可重复读和幻读,但性能较低。
设置隔离级别
可以使用 SET TRANSACTION ISOLATION LEVEL
来设置事务的隔离级别:
示例:设置隔离级别为 REPEATABLE READ
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
事务锁
在 MySQL 中,事务通过 锁 来控制并发访问。当一个事务对数据进行修改时,会对该数据加锁,确保其他事务不能修改相同的数据。MySQL 提供了多种锁机制:
- 行级锁:在
InnoDB
存储引擎中,支持行级锁,即只锁定正在修改的行,允许其他事务访问其他行。 - 表级锁:当对表加锁时,其他事务不能访问该表的数据。
MySQL 事务的并发控制
并发控制是事务管理的核心内容之一,确保多个事务在并发执行时仍能保证数据的一致性。MySQL 提供了以下机制来控制并发:
- 锁的使用:通过行级锁或表级锁来确保事务对数据的独占访问。
- 死锁:当两个或更多事务形成循环等待,导致无法继续执行时,就会发生死锁。MySQL 会自动检测并处理死锁,通常会回滚其中一个事务。
参考资料
- 🔗 MySQL 事务官方文档
- 🔗 [MySQL 隔离级别文档](https://dev.mysql.com/doc/refman/8.0/en/transaction- isolation.html)
- 🔗 MySQL 锁机制官方文档
如果你有关于 MySQL 事务的进一步问题或需要更多的示例,随时告诉我!
发表回复