目录
[读未提交(READ UNCOMMITTED)](#读未提交(READ UNCOMMITTED))
[读已提交(READ COMMITTED)](#读已提交(READ COMMITTED))
[可重复读(REPEATABLE READ)](#可重复读(REPEATABLE READ))
MySQL事务是数据库管理系统(DBMS)中的一个核心概念,它确保了一系列数据库操作要么全部成功,要么全部失败,从而维护数据库的完整性和一致性。以下是对MySQL事务的详细解析:
一、事务的四大特性(ACID)
原子性(Atomicity)
- 原子性是指事务是一个不可分割的工作单位,事务内的操作要么全部成功,要么全部回滚。
- 在MySQL中,使用BEGIN、COMMIT和ROLLBACK等语句来控制事务的边界,保证事务的原子性。
一致性(Consistency)
- 一致性是指事务执行前后,数据库的状态必须保持一致。
- 在MySQL中,通过事务的隔离级别和锁机制来保证事务的一致性。
隔离性(Isolation)
- 隔离性是指并发执行的事务之间相互隔离,每个事务都感觉不到其他事务的存在。
- MySQL支持多个隔离级别,如读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE),可以根据需求选择合适的隔离级别。
持久性(Durability)
- 持久性是指一旦事务提交,其所做的修改将永久保存在数据库中,即使发生系统故障或数据库重启也不会丢失。
- MySQL通过事务日志(redo log)和回滚日志(undo log)来实现持久性。redo log记录的是已经成功提交的事务操作信息,用来恢复数据,保证事务的持久性;undo log记录的是事务修改之前的数据信息,用来回滚数据,保证事务的原子性。
二、事务的状态
- 活动(Active):事务进入活动状态表示它已经开始,但尚未完成。这是事务的起始状态。
- 部分提交(Partially Committed):事务执行了所有的SQL语句,但尚未提交。在这个状态下,事务对数据库所做的修改已被写入事务日志,但尚未应用到数据库中。
- 已提交(Committed):事务已经成功完成并已提交。在这个状态下,事务对数据库所做的修改已经永久保存在数据库中,成为数据库的一部分。
- 失败(Failed):事务执行过程中发生了一个错误,导致事务无法继续执行。在这个状态下,通常会选择回滚事务,将数据库恢复到事务开始前的状态。
- 中止(Aborted):事务被中止,可能是由于发生错误导致的回滚,也可能是由于应用程序显式地中止了事务。
- 挂起(Suspended):事务处于一个暂时的挂起状态,等待某些条件满足后再继续执行。这通常与事务隔离级别相关,例如,在并发控制中等待其他事务释放锁。
三、事务的使用
使用事务有两种方式,分别为显式事务和隐式事务。
显式事务
- 手动启动:明确地使用START TRANSACTION或者BEGIN语句来显式地启动一个事务。这表示从这一点开始,所有的数据库操作将作为一个事务进行处理。
- 手动提交或回滚:在事务执行结束后,需要明确地使用COMMIT提交事务,或者使用ROLLBACK回滚事务。这使得开发者有更精确的控制,可以根据业务逻辑决定是否提交或回滚事务。
隐式事务
- 自动启动:在默认情况下,每个SQL语句都被视为一个事务。这意味着在执行SQL语句时,会自动启动一个事务。
- 自动提交:在隐式事务中,每个SQL语句执行后都会自动提交事务,除非显式地使用SET AUTOCOMMIT=0关闭自动提交,这时需要使用COMMIT或ROLLBACK手动处理事务。
四、事务的隔离级别
读未提交(READ UNCOMMITTED)
- 允许脏读,即允许一个事务看到其他事务未提交的修改。
- 这种隔离级别最低,性能最高,但一致性最差。
读已提交(READ COMMITTED)
- 只允许一个事务看到其他事务已经提交的修改。
- 这种隔离级别可以防止脏读,但不能防止不可重复读和幻读。
可重复读(REPEATABLE READ)
- 确保如果在一个事务中执行两次相同的SELECT语句,都能得到相同的结果。
- 这种隔离级别可以防止脏读和不可重复读,但不能完全防止幻读(在某些数据库系统中,如MySQL的InnoDB引擎,通过间隙锁等技术可以进一步防止幻读)。这是MySQL的默认事务级别。
串行化(SERIALIZABLE)
- 将事务完全隔离,使得它们按顺序执行。
- 这种隔离级别最高,一致性最好,但性能最低。