数据库事务隔离级别


文档摘要

数据库事务隔离级别 事务隔离级别是数据库并发控制的重要机制。 四种隔离级别 读未提交 特点: 可以读取未提交的数据 可能出现脏读 性能最好 读已提交 特点: 只能读取已提交的数据 避免脏读 可能出现不可重复读 可重复读 特点: 同一事务中读取结果一致 避免不可重复读 可能出现幻读 MySQL默认级别。 串行化 特点: 完全串行执行 避免所有并发问题 性能最差 并发问题 脏读 读取未提交的数据: 不可重复读 同一事务中多次读取结果不同: 幻读 查询结果集变化: MVCC机制 MySQL通过MVCC实现快照读: Read View 记录事务开始时的活跃事务列表。

数据库事务隔离级别

事务隔离级别是数据库并发控制的重要机制。

四种隔离级别

读未提交

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

特点:

  • 可以读取未提交的数据
  • 可能出现脏读
  • 性能最好

读已提交

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

特点:

  • 只能读取已提交的数据
  • 避免脏读
  • 可能出现不可重复读

可重复读

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

特点:

  • 同一事务中读取结果一致
  • 避免不可重复读
  • 可能出现幻读

MySQL默认级别。

串行化

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

特点:

  • 完全串行执行
  • 避免所有并发问题
  • 性能最差

并发问题

脏读

读取未提交的数据:

事务A:UPDATE account SET balance = 100 事务B:SELECT balance(读到100) 事务A:ROLLBACK 结果:事务B读到不存在的数据

不可重复读

同一事务中多次读取结果不同:

事务A:SELECT balance(读到100) 事务B:UPDATE account SET balance = 200; COMMIT 事务A:SELECT balance(读到200)

幻读

查询结果集变化:

事务A:SELECT * FROM users WHERE age > 18(10条) 事务B:INSERT INTO users VALUES (...); COMMIT 事务A:SELECT * FROM users WHERE age > 18(11条)

MVCC机制

MySQL通过MVCC实现快照读:

Read View

记录事务开始时的活跃事务列表。

版本链

记录行的多个版本:

row: [版本1] -> [版本2] -> [版本3]

快照读vs当前读

-- 快照读:读取事务开始时的版本 SELECT * FROM users; -- 当前读:读取最新版本 SELECT * FROM users FOR UPDATE;

锁机制

共享锁

SELECT * FROM users LOCK IN SHARE MODE;

排他锁

SELECT * FROM users FOR UPDATE;

间隙锁

防止幻读:

-- 锁定范围 SELECT * FROM users WHERE id BETWEEN 10 AND 20 FOR UPDATE;

选择建议

根据业务需求选择:

  • 读未提交:几乎不用
  • 读已提交:互联网应用常用
  • 可重复读:金融交易等场景
  • 串行化:特殊要求场景

理解隔离级别,合理配置并发策略。


发布者: 作者: 转发
评论区 (0)
U