377 字
2 分钟
数据库隔离级别
数据库隔离级别
有什么用?
数据库隔离使一个事务看起来像是在没有其他并发事务的情况下独立执行。
上图展示了四种隔离级别。
隔离级别
-
可串行化(Serializable): 最高的隔离级别。并发事务被保证按顺序执行。
-
可重复读(Repeatable Read): 事务期间读取到的数据从事务开始到结束保持不变。
-
读已提交(Read Committed): 只有在事务提交后,数据修改才对其他事务可见。
-
读未提交(Read Uncommitted): 事务未提交的修改也可能被其他事务读取。
隔离性通常通过 MVCC(多版本并发控制)与锁来实现。
MVCC 示例
下图以“可重复读”为例,演示 MVCC 的工作方式:
每一行都有两个隐藏列:transaction_id 和 roll_pointer。事务 A 开始时,会创建一个新的 Read View(读视图),其可见性记录如 transaction_id=201。随后事务 B 开始,创建新的读视图,其 transaction_id=202。
现在事务 A 将余额修改为 200,会生成一条新的版本记录,roll_pointer 指向旧行。在事务 A 提交之前,事务 B 读取余额数据。事务 B 发现 transaction_id 201 对应的记录尚未提交,于是读取下一条已提交的版本(例如 transaction_id=200)。
即便事务 A 随后提交,事务 B 仍然根据其启动时创建的读视图读取数据。因此,事务 B 始终读到余额为 100。