Transaction
事务
开启事务
START TRANSACTION;
-- sql_1;
-- ...
-- sql_n;
COMMIT;
事务 ACID 特性
|
|
原子性(Atomicity) |
一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节 |
一致性(Consistency) |
在事务开始之前和事务结束以后,数据库的完整性没有被破坏 |
隔离性(Isolation) |
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括**读未提交**(READ-UNCOMMITED)、读已提交(READ-COMMITED)、可重复读(REPEATABLE-READ)、可串行化(SERIALIZABLE) |
持久性(Durability) |
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失 |
InnoDB 事务实现原理
|
|
持久性 |
重做日志(redo log) |
原子性 |
回滚日志(undo log) |
隔离性 |
锁机制、多版本并发控制(MVCC) 等 |
一致性 |
持久性、原子性、隔离性 |
并发事务问题
|
|
第一类丢失更新(回滚丢失) |
回滚一个事务的时候,覆盖了另一个事务已提交的修改 |
脏读 |
读取到另一个事务尚未提交的修改,并基于这个数据进行了操作 |
不可重复读 |
在两次读取数据的过程中,由于其它事务的修改,导致两次读取的数据不一致 |
第二类丢失更新(覆盖丢失) |
提交一个事务的时候,覆盖了另一个事务已提交的修改 |
幻读 |
在两次读取数据的过程中,由于其它事务的修改,导致两次读取的集合不一致 |
事务隔离级别
SQL 标准定义了四个隔离级别
|
第一类丢失更新 |
脏读 |
不可重复读 |
第二类丢失更新 |
幻读 |
读未提交 |
不可能 |
可能 |
可能 |
可能 |
可能 |
读已提交 |
不可能 |
不可能 |
可能 |
可能 |
可能 |
可重复读 |
不可能 |
不可能 |
不可能 |
不可能 |
可能 |
可串行化 |
不可能 |
不可能 |
不可能 |
不可能 |
不可能 |