事务的基本要素(ACID)

  1. 原子性

  2. 一致性

  3. 隔离性

  4. 持久性

  5. 读未提交 Read Uncommitted(在本次事务中可以读到其他事务中没有提交的数据 - 脏数据:别人修改数据的事务尚未提交,在我的事务中也能读到)

  6. 读已提交 Read Committed (只能读到其他事务提交过的数据。如果在当前事务中,其他事务有提交,则两次读取结果不同:别人修改数据的事务已经提交,才能读到)

  7. 可重复读 Repeatable Read (默认,保证了事务中每次读取结果都相同,而不管其他事物是否已经提交。会出现幻读)

  8. 序列化 Serializable (隔离级别中最严格的,开启一个 serializable 事务,那么其他事务对数据表的写操作都会被挂起)

脏读

会话2读取到了会话1还没提交的修改数据事务的数据,称为脏读,对A来说就是读取到了脏数据。

幻读

系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

不可重复读

事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

隔离级别 脏读 不可重复读 幻读
读未提交 可能 可能 可能
读已提交 不可能 可能 可能
可重复读 不可能 不可能 可能
序列化 不可能 不可能 不可能