推荐答案
脏读(Dirty Read):一个事务读取了另一个未提交事务的数据。如果未提交的事务回滚,那么读取到的数据就是无效的,称为脏数据。
不可重复读(Non-Repeatable Read):一个事务在多次读取同一数据时,由于其他事务的修改或删除操作,导致前后读取的数据不一致。
幻读(Phantom Read):一个事务在多次查询同一范围的数据时,由于其他事务的插入操作,导致前后查询到的结果集不一致。
本题详细解读
脏读(Dirty Read)
脏读发生在一个事务读取了另一个未提交事务的数据时。如果未提交的事务最终回滚,那么读取到的数据就是无效的,称为脏数据。脏读通常发生在事务隔离级别为READ UNCOMMITTED
的情况下。
示例:
-- 事务A BEGIN; UPDATE users SET balance = balance - 100 WHERE id = 1; -- 事务B BEGIN; SELECT balance FROM users WHERE id = 1; -- 读取到未提交的修改
如果事务A回滚,事务B读取到的数据就是无效的。
不可重复读(Non-Repeatable Read)
不可重复读发生在一个事务在多次读取同一数据时,由于其他事务的修改或删除操作,导致前后读取的数据不一致。不可重复读通常发生在事务隔离级别为READ COMMITTED
的情况下。
示例:
-- -------------------- ---- ------- -- --- ------ ------ ------- ---- ----- ----- -- - -- -- ----- -- --- ------ ------ ----- --- ------- - ------- - --- ----- -- - -- ------- -- --- ------ ------- ---- ----- ----- -- - -- -- --------------
事务A在两次读取同一数据时,由于事务B的修改操作,导致结果不一致。
幻读(Phantom Read)
幻读发生在一个事务在多次查询同一范围的数据时,由于其他事务的插入操作,导致前后查询到的结果集不一致。幻读通常发生在事务隔离级别为REPEATABLE READ
的情况下。
示例:
-- -------------------- ---- ------- -- --- ------ ------ - ---- ----- ----- --- - --- -- ----- -- --- ------ ------ ---- ----- ------ ---- ------ --------- ---- ------- -- --- ------ - ---- ----- ----- --- - --- -- ---------------
事务A在两次查询同一范围的数据时,由于事务B的插入操作,导致结果集不一致。