DBMS中的事务隔离级别

先决条件—— 数据库管理系统中的并发控制 , 数据库管理系统中的酸性质

null

正如我们所知,为了保持数据库的一致性,它遵循ACID属性。在这四个属性(原子性、一致性、隔离性和持久性)中,隔离决定了其他用户和系统如何看到事务完整性。这意味着一个事务应该以这样的方式在系统中发生,即它是访问数据库系统中资源的唯一事务。 隔离级别定义了一个事务必须与数据库系统中任何其他事务所做的数据修改隔离的程度。事务隔离级别由以下现象定义——

  • 肮脏的阅读—— 脏读是指事务读取尚未提交的数据的情况。例如,假设事务1更新一行并使其保持未提交状态,同时,事务2读取更新的行。如果事务1回滚更改,则事务2将读取被认为从未存在过的数据。
  • 不可重复读取- 当一个事务两次读取同一行并每次获取不同的值时,就会发生不可重复读取。例如,假设事务T1读取数据。由于并发性,另一个事务T2更新相同的数据并提交,现在如果事务T1重新读取相同的数据,它将检索不同的值。
  • 幻影阅读- 当执行两个相同的查询,但这两个查询检索到的行不同时,就会发生幻象读取。例如,假设事务T1检索满足某些搜索条件的一组行。现在,事务T2生成一些与事务T1的搜索条件匹配的新行。如果事务T1重新执行读取行的语句,那么这次它将获得一组不同的行。

基于这些现象,SQL标准定义了四个隔离级别:

  1. 阅读未承诺—— Read Uncommitted是最低隔离级别。在此级别中,一个事务可能会读取其他事务尚未提交的更改,从而允许脏读。在这个级别上,事务并不是相互隔离的。
  2. 阅读承诺—— 此隔离级别保证在读取数据时提交任何读取的数据。因此,它不允许脏读。事务在当前行上持有读或写锁,从而防止其他事务读取、更新或删除它。
  3. 可重复读取- 这是最严格的隔离级别。事务在其引用的所有行上持有读锁,并在被引用行上为更新和删除操作写入锁。由于其他事务无法读取、更新或删除这些行,因此它避免了不可重复的读取。
  4. 可序列化– 这是最高的隔离级别。A. 可序列化 执行保证是可序列化的。Serializable execution(可序列化执行)被定义为一种操作的执行,其中并发执行的事务似乎是串行执行的。

下表清楚地描述了隔离级别、读取现象和锁之间的关系:

图片[1]-DBMS中的事务隔离级别-yiteyi-C++库

异常可序列化与可序列化不同。也就是说,一个可序列化的时间表应该没有这三种类型的现象,这是必要的,但还不够。

参考资料- 隔离——维基百科 事务隔离级别–文档。微软

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享