现在,我正在阅读有关数据库或文件系统如何处理并行执行事务的内容。我知道数据库和文件系统将执行日志记录操作以确保事务的原子性失败。据我所知,预写日志是一种很有前途的方法。
预写日志记录将维护修改数据的另一个副本。对于重做日志,待更新的数据将首先写入日志,然后,将进行真正的更新。
我很好奇的是以下内容:
如果首先,我在表A中执行一个大的INSERT事务I_TX,然后在I_TX期间,我在同一个表A上执行SELECT事务S_TX,我将从I_TX获取插入的数据吗?如果我得到它,那么我收到的数据是来自日志还是真正的更新数据?
谢谢你。
答案 0 :(得分:1)
您要引用的属性是数据库的ACID属性。这个缩写代表原子性,一致性,隔离性和持久性,并且有自己的Wikipedia page。这些通过锁定而不是通过日志来实现。
这些是数据库非常重要的属性,日志记录是其实现的重要组成部分。但是,完全实现ACID会产生大量开销,因此有时候数据库的要求会更宽松,尤其是在修改数据时的可见性。
您的问题的答案是使用数据页而不是日志解析select
。该日志用于回滚目的。 (在某些情况下,某些数据库可能会使用日志。)区别在于由update
事务("脏页")修改的数据页与未更新的数据页之间的区别。你有几种情况,例如:
select
可以读取已修改和未修改的数据页。select
都可以等待并且只读取未修改页面中的数据。select
可以在update
之前读取未修改的网页。并且update
可以(基本上)复制任何被修改的页面。select
可以等待update
完成,然后阅读页面。第一个是数据的不一致视图。其余的是一致的。
"正确"方法是select
查看数据一致视图的一种方法。一些数据库,允许读取"脏"页面,这意味着它们是事务的一部分但未提交。这不是严格遵守ACID的,但它更快。
此外,不同的数据库对各种锁定机制以及可以覆盖的程度有不同的支持。数据库甚至不同于update
"自动提交"或者必须等待明确的提交。