PHP实战中知识总结 / Mysql - 事务
事务就是一组原子性的SQL查询,或者说一个独立的逻辑工作单元。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。如果其中任何一条语句因为崩溃或其他原因无法执行,那么所有语句都不会执行。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。
一、事务的四大特性(ACID):
(1)原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。
(2)隔离性(isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的
(3)持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。
(4)一致性(consistency):数据库总数从一个一致性的状态转换到另一个一致性的状态
二、四种隔离级别:
数据库事务的四种隔离级别,由低到高分别为
(1)读未提交(Read uncommitted):一个事务可以读取另一个未提交事务的数据。
(2)读提交(Read committed):一个事务要等另一个事务提交后才能读取数据。
(3)重复读(Repeatable read):在开始读取数据(事务开启)时,不再允许修改操作
(4)串行化(serializable):Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能。
三、事务的并发问题
(1)脏读:事务A读取了事务B更新的数据,事务B回滚操作,那么A读取到的数据是脏数据。
(2)不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据做了更新并提交,导致事务A多次读取同一数据时,结果不一致。(不可重复读对应的是update操作)
(3)幻读:在一个事务内,两次查询的数据条数不一致。幻读和不可重复读有些类似,同样是两次查询过程中,不同的是,幻读是由于其他事务做了插入记录的操作,导致记录数增加。(幻读对应的是insert操作)
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
读提交(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
THINKPHP5框架的事务操作实例:
// 启动事务
Db::startTrans();
try {
Db::table('think_user')->find(1);
Db::table('think_user')->delete(1);
// 提交事务
Db::commit();
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
}