概述
- 事务是关系型数据库最为重要的机制之一,MySQL默认的引擎InnoDB也提供了相应支持
- 关系型数据库事务需要满足的4个特性(ACID):
- 原子性(Atomicity):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节和状态;如果事务在执行过程中发生异常,会回滚到事务开始前的状态
- 一致性(Consistency):在事务开始之前和事务结束以后,数据库中数据的业务完整性没有被破坏;即写入的数据必须完全符合所有的预设业务规则,这包含数据的精确度、串联性以及后续数据库可以自发性地完成预定的工作;
- 隔离性(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致
- 持久性(Durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失
- 最典型的就如一个银行账户A向账户B转账,A账户的资金扣减和B账户的资金增加必须符合上述的事务特性
违反ACID的问题
- 数据库都是支持多请求(多事务)并发的,在并发请求的场景中,可能存在的问题
脏读
-
一个事务读取了另一个事务未提交的数据
-
如下图:
不可重复读
-
一个事务多次读取同一条记录,但每次读取的内容不一致,主要针对update操作
-
如下图:
幻读
-
一个事务多次读取批量数据,但读取到别的事务添加的数据;主要针对insert、delete操作
-
如下图:
事务隔离级别
-
针对数据库设置不同的事务隔离级别,能有效的避免上述的问题
-
事务隔离级别由低到高包括:
- 读未提交(Read uncommitted)
- 读已提交(Read committed)
- 可重复读(Repeatable read)
- 串行化(Serializable)
-
事务隔离级别越低,越容易产生数据不一致问题,但并发效率也好;隔离级别越高,虽不容易产生数据不一致问题,但并发效率也越差
-
MySQL的InnoDB引擎默认的事务隔离级别为可重复读;同时,通过行锁配合间隙锁解决幻读问题
-
如下图:
MySQL事务隔离级别操作
- MySQL可使用select @@tx_isolation查看事务隔离级别
- 可以设置成不同的事务隔离级别,分全局(global)和会话(session)级别的
欢迎来到testingpai.com!
注册 关于