三分钟图解事务隔离级别,看一遍就懂
发布网友
发布时间:2024-10-03 23:10
我来回答
共1个回答
热心网友
时间:2024-11-02 18:27
数据库系统中的“锁”特性,主要针对事务进行,锁定数据库对象如表、页、行等,以提高并发性。然而,锁在带来并发性的同时,也产生了一些潜在的并发一致性问题,包括丢失更新、脏读、不可重复读和幻读。
为解决这些锁带来的问题,ISO 和 ANIS SQL 标准制定了四种事务隔离级别,分别是 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE,分别对应解决锁带来的各种并发一致性问题。
丢失更新发生在一个事务更新数据后,另一个事务更新了同一数据,导致第一个事务的更新被覆盖。这种情况实际中不会发生,因为数据库会锁定行或粗粒度级别对象,阻止其他事务在锁定期间对同一数据进行更新。然而,逻辑意义上的丢失更新在开发环境中仍然存在,比如两个用户同时查看同一数据并进行修改。
脏读是指事务读取到另一个事务未提交的数据。这种情况通常不会发生,因为现代数据库的隔离级别至少为 READ COMMITTED,禁止读取未提交的数据。
不可重复读是指在一个事务内,多次读取同一数据集合时,由于另一个事务对同一数据集合进行修改,导致两次读取结果不同。幻读则是在不可重复读的基础上,数据增加或减少导致读取结果数量变化。
四种隔离级别分别是:
1. READ UNCOMMITTED:读取未提交数据,事务中的修改即使未提交也可见,但数据库本身已具备阻止丢失更新的能力。
2. READ COMMITTED:一个事务只能读取已经提交的事务所做的修改,事务修改在提交前对其他事务不可见。
3. REPEATABLE READ:保证在同一个事务中多次读取同一数据的结果一致,InnoDB 存储引擎默认隔离级别。
4. SERIALIZABLE:强制事务串行执行,多个事务互不干扰,不会出现并发一致性问题。
隔离级别的提高能解决更多的并发一致性问题,但性能代价也相应增大。InnoDB 存储引擎在 REPEATABLE READ 级别下使用 Next-Key Lock 算法避免了幻读,达到了 SERIALIZABLE 隔离级别的要求。