隔离级别

1.引言

InnoDB是事务安全型的,具备ACID特性:

  1. 原子性 atomic:事务被视为不可分割的最小工作单元;
  2. 一致性consistency:数据库总是从一个一致性的状态转换到另一个一致性的状态。比如事务中通过两条sql对银行进行转账服务,加入崩溃的话,两个账号都不会损失钱;
  3. 隔离性 isolation:通常,事务所做的修改最终在提交之前,对其他事务是不可见的。共有四种,下文详细论述;
  4. 持久性:事务一旦提交,所做的修改便永远保存在数据库中。
默认设置下,事务都是自动提交的,使用如下命令显式开启BEGIN, ROLLBACK, COMMIT;

隔离级别是针对事务transaction来说的,每一种隔离级别都规定了:事务中所做的修改,在事务内和事务间哪些是可见的那些是不可见的。

隔离级别一共有级,从低到高分别是 read uncommitted 未提交读、read commit 提交读、repeatable read可重复读和serializable可串行化。其中隔离级别越低、系统开销越小、越能执行更高的并发。

2. 四种隔离级别简介

未提交读、提交读、可重复度、可串行化四种隔离级别的结果区别在于脏读可能性、不可重复读可能性、幻读可能性和加锁读。,列别如下:

2.1 read uncommitted未提交读/(感觉翻译成“读取事务未提交的内容”更合适)

如名,transaction_a中的修改,即使事务还未提交,这些修改对于其他事务还是可见的事务读取其他事务未提交的数据,被称为脏读dirty read。因为未提交的数据可能会提交失败而回滚,是不确定的。

2.2 read committed 提交读(可以认为是读取提交的数据)又名不可重复读nonrepeatable read

大多数数据库的默认隔离级别。即事务从开始到提交前,所做的修改对其他事务都是不可见的。

所谓“不可重复读”是因为在一个事务范围内对于同一种数据的多次查询返回了不同的值,因为在此次事务范围时间内,数据被其他事务修改了。

2.3 可重复度 repeatable read-mysql默认隔离级别

保证了同一个事务中读词读取相同的记录结果是一样的,即使期间其他事务修改了这些记录

这种级别不能防止幻读 phantom read,所谓幻读就是事务在读取某个范围的记录时,另一个事务在该范围插入了新的记录,导致当前事务再次读取该范围内的记录时产生幻行phantom row

??不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)??

2.4 serializable 可串行化(事务串行执行)

强制所有事务穿行执行。很少用,除非要确保数据一致性且接受没有并发

posted on 2018-04-21 14:09  coderDu  阅读(213)  评论(0编辑  收藏  举报