先决条件 – DBMS 中的并发控制,DBMS 中的 ACID 属性
我们知道,为了保持数据库的一致性,它遵循 ACID 属性。在这四个属性(原子性、一致性、隔离性和持久性)中,隔离性决定了事务完整性如何对其他用户和系统可见。这意味着事务应该以这样的方式在系统中发生,即它是访问数据库系统中资源的唯一事务。
隔离级别定义了事务必须与数据库系统中任何其他事务所做的数据修改隔离的程度。事务隔离级别由以下现象定义:
- 脏读——脏读是事务读取尚未提交的数据的情况。例如,假设事务 1 更新一行并使其未提交,同时事务 2 读取更新的行。如果事务 1 回滚更改,事务 2 将读取被认为从未存在的数据。
- 不可重复读——当一个事务两次读取同一行并每次获得不同的值时,就会发生不可重复读。例如,假设事务 T1 读取数据。由于并发,另一个事务 T2 更新了相同的数据并提交,现在如果事务 T1 重新读取相同的数据,它将检索到不同的值。
- 幻读——当执行两个相同的查询,但两者检索的行不同时,就会发生幻读。例如,假设事务 T1 检索一组满足某些搜索条件的行。现在,事务 T2 生成一些与事务 T1 的搜索条件匹配的新行。如果事务 T1 重新执行读取行的语句,这次它会得到一组不同的行。
基于这些现象,SQL 标准定义了四个隔离级别:
- Read Uncommitted – Read Uncommitted 是最低的隔离级别。在这一级别,一个事务可能会读取其他事务尚未提交的更改,从而允许脏读。在这个级别,事务之间不是相互隔离的。
- 已提交读 –此隔离级别可确保在读取任何数据读取时提交。因此它不允许脏读。事务持有当前行的读或写锁,从而防止其他事务读取、更新或删除它。
- 可重复读取——这是最严格的隔离级别。事务在它引用的所有行上持有读锁,并在它插入、更新或删除的所有行上写锁。由于其他事务无法读取、更新或删除这些行,因此避免了不可重复读取。
- 可序列化——这是最高的隔离级别。可序列化的执行保证是可序列化的。可串行化执行被定义为一种操作的执行,其中并发执行的事务看起来是串行执行的。
下表清楚地描述了隔离级别、读取现象和锁之间的关系:
Anomaly Serializable 与 Serializable 不同。也就是说,Serializable 调度应该没有所有三种现象类型是必要的,但还不够。
参考 –
隔离 – 维基百科
事务隔离级别 – docs.microsoft