MySQL中的事务隔离级别
事务的特性(ACID)
-
原子性(Atomicity):一个事务必须被视为一个不可分割的最小工作但愿,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作
-
一致性(Consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态。
-
隔离性(Isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的。同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。
-
持久性(Durability):一旦事务提交,事务对数据库的所有更新将被保存到数据库,不能回滚。
事务并发存在的问题
-
脏读:事务读取了未提交的数据。如:事务A读取了事务B更新的数据,然后事务B回滚了,那么A读取到的数据是脏数据。
-
不可重复读:在同一个事务中两次执行同样的查询,得到的结果不一致。如:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
-
幻读:当某个事务在读取某个范围内的记录时,另一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行。InnoDB可以通过多版本并发控制(MVCC)解决幻读的问题。
事务隔离级别
-
READ UNCOMMITTED(未提交读):一个事务中的修改操作即使没有提交,对其他事务也都是可见的。会出现脏读的问题
-
READ COMMITTED(提交读):一个事务开始时,只能“看见”已经提交的事务所做的修改。解决了脏读的问题,但是会存在不可重复读的问题
-
REPEATABLE READ(可重复读):一个事务在多次读取同样记录时,结果是一致的。解决了脏读和不可重复读的问题,但是无法解决幻读的问题
-
SERIALIZABLE(可串行化):在读取的每一行数据上都加锁,通过强制事务串行执行的方式,避免了脏读、不可重复读和幻读的问题,但是性能差
隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | 加锁读 |
---|---|---|---|---|
读未提交(read-uncommitted) | Yes | Yes | Yes | No |
不可重复读(read-committed) | No | Yes | Yes | No |
可重复读(repeatable-read) | No | No | Yes | No |
可串行化(serializable) | No | No | No | Yes |
总结
- 事务的隔离级别从高到低的排序为:可串行化 > 可重复读 > 不可重复读 > 读未提交
- 不可重复读针对的是记录的修改操作,幻读针对的是记录的插入操作
- MySQL默认的事务隔离级别是
REPEATABLE-READ
,可以通过show variables like 'transaction_isolation';
命令查看