| Read uncommitted | Read committed | Repeatable read | Serializable | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
定义 | 允许一个事务可以读取另一个未提交事务的数据 | 一个事务只能读取另一个已提交事务的数据
| 在同一个事务内的查询都是事务开始时刻时的值,即使两次查询时间其它事务有执行Update操作 | 同一条数据库记录的读写操作按照一个序列化顺序执行,不会产生交叉的情况 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
举例 |
|
|
|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
问题 | 脏读 一个事务读取到了另一个未提交事务的数据 对老公而言,T3时刻的查询结果受到了老婆T2时刻的影响 | 不可重复读 一个事务范围内两个相同的查询返回了不同数据,体现在update操作 对老公而言,T3和T6时刻相同的查询返回的余额不同 | 幻读 一个事务在执行两次同样条件的查询期间,因为另一个事务对数据进行了新增或者删除,导致两次查询出来的记录数不一样,体现在insert操作 对老公而言, T1和T4时刻两次查询结果不一样,凭空多了一笔消费 |
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
解决方案 | 使用Read committed | 使用可重复读 | 使用序列化 |
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
改良后 |
|
|
|
|