比较不同的事务隔离级别
事务隔离级别 | 说明 | 是否脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
读未提交 (read-uncommitted) | 当前事务可以读到其他事务 未提交 的数据。 例如:事务 A 和事务 B,B 的隔离级别是 read-uncommitted。 当 A insert 一记录,但未提交事务时,B 已经可以读到该记录,如果 A 回滚了事务, 则 B 读到的数据是有问题的,这叫脏读 |
是 | 是 | 是 |
不可重复读(read-committed) | 当前事务可以读到其他事务 已提交 的数据。 例如:事务 A 和事务 B, B 的隔离级别是 read-committed。 当 B select 了某个数据后, A 修改了这个数据并且提交事务,这时 B 再读时会读到新数据 |
否 | 是 | 是 |
可重复读(repeatable-read) | 当前事务读不到其他事务的 已提交 的数据。 例如:事务 A 和事务 B,B 的隔离级别是 repeatable-read。 当 B select 了某个数据后, A 修改了这个数据并且提交事务,这时 B 再读时读到的是旧数据。由于 B 读不到新数据,所以只能用旧数据,如果新旧数据不一样,这叫幻读 |
否 | 否 | 是 |
串行化(serializable) | 两个事务互斥。 例如:事务 A 和事务 B, B的隔离级别是 serializable。 当 B 查询或修改某个表时,A 修改这个数据时会阻塞(读不会)如果 A 先修改了某个表, B 不能读或写这个表 |
否 | 否 | 否 |