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