Skip to content
Carol's Blog
Go back

数据库事务的隔离级别有哪些?

Edit page

数据库事务的隔离级别是为了平衡并发性能和数据一致性而设计的标准,主要分为四个级别,按隔离程度从低到高排列如下:


1. 读未提交(Read Uncommitted)


2. 读已提交(Read Committed)


3. 可重复读(Repeatable Read)


4. 串行化(Serializable)


并发问题说明

1. 脏读(Dirty Read) 定义:事务A读取了事务B 未提交 的修改,若事务B回滚,事务A读到的是无效数据。

场景示例:银行转账

  BEGIN;
  UPDATE account SET balance = balance - 100 WHERE user = 'Alice';
-- Alice扣款100元
  UPDATE account SET balance = balance + 100 WHERE user = 'Bob';
-- Bob收款100元(未提交)
  BEGIN;
  SELECT balance FROM account WHERE user = 'Bob';  -- 读到了+100元(但事务A未提交)
  ROLLBACK;  -- 转账失败,数据恢复原状

隔离级别影响:


2. 不可重复读(Non-repeatable Read) 定义:同一事务中多次读取同一数据,结果不同(其他事务 提交了更新)。

场景示例:用户余额查询

  BEGIN;
  SELECT balance FROM account WHERE user = 'Alice';  -- 第一次查询:余额500元
  BEGIN;
  UPDATE account SET balance = 400 WHERE user = 'Alice';  -- 扣款100元
  COMMIT;
  SELECT balance FROM account WHERE user = 'Alice';  -- 第二次查询:余额400元
  COMMIT;

隔离级别影响:


3. 幻读(Phantom Read) 定义:同一事务中多次范围查询,结果集的行数不同(其他事务 提交了插入或删除)。

场景示例:统计订单数量

  BEGIN;
  SELECT COUNT(*) FROM orders WHERE user = 'Alice';  -- 第一次查询:3个订单
  BEGIN;
  INSERT INTO orders (user, amount) VALUES ('Alice', 200);  -- 新增一个订单
  COMMIT;
  SELECT COUNT(*) FROM orders WHERE user = 'Alice';  -- 第二次查询:4个订单
  COMMIT;

隔离级别影响:


三者的核心区别

问题类型操作类型关键特征示例场景
脏读读取未提交的数据读到其他事务未提交的修改转账中途读取到未提交余额
不可重复读更新(UPDATE)同一数据多次读取结果不同余额在查询期间被其他事务修改
幻读插入或删除(INSERT/DELETE)范围查询的结果集行数变化统计订单数量时新增了订单

数据库差异


选择合适的隔离级别需权衡数据一致性和性能。低级别适合高并发但容忍暂时不一致的场景,高级别则用于需要强一致性的关键业务。


Edit page
Share this post on:

评论

加载评论中...

发表评论


Previous Post
Spring事务传播机制
Next Post
网站速度优化