【问题标题】:Simultaneous INSERT/SELECT transactions or Read/Write operations handled in a database or file system在数据库或文件系统中同时处理 INSERT/SELECT 事务或读/写操作
【发布时间】:2016-01-09 13:17:48
【问题描述】:

现在,我正在阅读有关数据库或文件系统如何处理并行执行事务的内容。而且我知道数据库和文件系统会进行日志记录操作,以确保事务的故障原子性。据我所知,预写日志记录是一种很有前途的方法。

预写日志将维护修改数据的另一个副本。对于redo-logging,需要更新的数据会先写入日志,然后才是真正的更新。

而我很好奇的是:

如果一开始,我在表 A 中执行了一个大的 INSERT 事务 I_TX,然后在 I_TX 期间,我在同一个表 A 上执行了一个 SELECT 事务 S_TX,我会从 I_TX 中获取插入的数据吗?如果我得到它,我得到的数据是来自日志还是真正的更新数据

谢谢。

【问题讨论】:

  • 我删除了无关的数据库标签。随意为您实际使用的数据库添加标签。

标签: sql database transactions filesystems


【解决方案1】:

您所指的属性是数据库的 ACID 属性。这个首字母缩写词代表原子性、一致性、隔离性和持久性,并有自己的Wikipedia page。这些是通过锁定而不是通过日志来实现的。

这些是数据库非常重要的属性,日志记录是其实现的重要组成部分。但是,完全实现 ACID 会产生大量开销,因此有时数据库的要求会更加宽松,尤其是在修改数据时的可见性方面。

您的问题的答案是select 是使用数据页而不是日志解决的。该日志用于回滚目的。 (在某些情况下,某些数据库确实使用日志。)区别在于由update 事务修改的数据页(“脏页”)与未更新的数据页。有几种情况,例如:

  • select 可以读取已修改和未修改的数据页。
  • select 可以等待并且只能从未修改的页面读取数据,无论是在事务提交之前还是之后。
  • select 可以读取update 之前的未修改页面; update 可以(基本上)复制任何正在修改的页面。
  • select 可以等待update 完成,然后读取页面。

首先是数据的不一致视图。其余一致。 “正确”方法是select 看到一致的数据视图的某种方式。一些数据库,允许读取“脏”页面,这意味着它们是事务的一部分但未提交。这并不严格符合 ACID,但速度更快。

此外,不同的数据库对不同的锁定机制以及它们可以被覆盖的程度有不同的支持。数据库甚至在update“自动提交”或必须等待显式提交方面存在差异。

【讨论】:

  • 谢谢,我的问题主要是关于隔离属性的。读未提交和脏读。
  • @user2688472 。 . .是的,主要是关于隔离属性。
猜你喜欢
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 2019-06-25
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多