隔离性是事务ACID中的I
事务的隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
读提交(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
事务的隔离级别含义
- 读未提交:是指 一个事务还没提交时, 它做的变更就能被别的事务看到。
- 读提交:是指 一个事务提交之后, 它做的变更才会被其他事务看到。
- 可重复读:是指一个事务执行过程中看到的数据, 总是跟这个事务在启动时看到的数据是一致的。 当然在可重复读隔离级别下, 未提交变更对其他事务也是不可见的。
- 串行化: 顾名思义是对于同一行记录, “写”会加“写锁”, “读”会加“读锁”。 当出现读写锁冲突的时候, 后访问的事务必须等前一个事务执行完成, 才能继续执行。
事务各问题的含义
- 脏读:一个事务读取到了另外一个事务没有提交的数据,两次读取到的数据不一致。
- 不可重复读:一个事务内两次读取某个数据是不一样的
- 幻读:是指当事务不是独立执行时发生的一种现象。例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
事务隔离的实现
在MySQL中, 实际上每条数据(记录)在更新的时候都会同时记录一条回滚操作。 通过回滚操作, 都可以得到前一个状态的值。
假设一个值从1被按顺序改成了2、 3、 4, 在回滚日志里面就会有类似下面的记录。
当前值是4, 但是在查询这条数据的时候, 不同时刻启动的事务会有不同的read-view。 如图中看到的, 在视图A、 B、 C里面, 这一个记录的值分别是1、 2、 4, 同一条数据在系统中可以存在多个版本, 就是数据库的多版本并发控制(MVCC) 。 对于read-view A, 要得到1, 就必须将前值依次执行图中所有的回滚操作得到。