MySQL:事务管理
目录
事务
事务的四大特性
事务提交方式
手动提交
自动提交
事务隔离级别
READ UNCOMMITTED(读未提交)
READ COMMITTED(读已提交)
REPEATABLE READ(可重复读)
SERIALIZABLE(可串行化)
事务
事务是指一组逻辑上被视为一个整体的数据库操作,它们要么全部成功执行,要么全部失败回滚,以保证数据库的一致性、完整性和可靠性。
一个MySQL数据库可能会有多个事务在运行,就有可能在同一时刻对同一张表进行访问,在不加保护的情况下就会出现问题,有了事务就能保证语句要么成功执行,那么失败回滚
在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务,MyISAM不支持
事务的四大特性
- 原子性:事务中的所有操作要么全部成功,要么全部不执行。如果其中任何一个操作失败,整个事务会被回滚到事务开始前的状态。
- 一致性:事务执行前后,数据库必须保持一致状态,所有规则和约束都必须得到满足。
- 隔离性:并发事务之间相互隔离,一个事务的中间状态对其他事务不可见,以防止脏读、不可重复读和幻读等问题。
- 持久性:一旦事务成功提交(Commit),即使系统发生故障,数据也会被永久保存。
事务提交方式
事务可以分成手动提交与自动提交两种模式
手动提交
START TRANSACTION; -- 或 BEGINUPDATE ...;INSERT ...;DELETE ...;
COMMIT; -- 或 ROLLBACK;
特点:
- 多个语句组成一个原子单元,全部成功或全部撤销。
自动提交
默认状态:autocommit = 1
特点:
- 语句执行成功即自动COMMIT,失败则自动ROLLBACK
- 不需要显式写START TRANSACTION / COMMIT
事务隔离级别
MySQL(InnoDB)支持四种标准的事务隔离级别,用来控制并发事务之间互相“看见”对方数据的程度。隔离级别越高,并发副作用越少,但性能越低;反之亦然。
READ UNCOMMITTED(读未提交)
允许事务读取尚未提交的“脏”数据。速度最快,但脏读、不可重复读、幻读都可能发生,实际生产极少使用。
脏读指的是读到另一个事务尚未提交的数据。
不可重复读同一事务内两次读同一行,得到不同结果。
幻读同一事务内两次范围查询,行数变多/变少
READ COMMITTED(读已提交)
一个事务只能读到其他事务已经提交的数据,避免了脏读;仍会出现不可重复读和幻读。
REPEATABLE READ(可重复读)
这是 InnoDB 默认的一种隔离级别
事务开始后,同一个查询语句无论执行多少次,看到的数据版本保持一致,解决了脏读和不可重复读;在 InnoDB 里通过间隙锁把幻读也几乎消除,因此比标准定义更严格。
SERIALIZABLE(可串行化)
完全串行化执行事务,像单线程一样排队跑,所有并发副作用都不存在,但吞吐量最低,只有在极端强一致场景才考虑。
查看当前会话的隔离级别:
select @@session.transaction_isolation;
修改当前会话的隔离级别:
set session transaction isolation level read committed;
设置全局隔离级别:
set global transaction isolation level repeatable read;
完