0
|
Gennady Vanin Ðеннадий Ðанин Mikael Svenson · 技术社区 · 14 年前 |
![]() |
1
4
Oracle在任何情况下都不允许脏读(即读取另一个会话的未提交值)。它违反了“孤立”(I in ACID )对于数据库,并且可能会给读取操作带来明显的不一致性[例如看到没有父记录的子记录]。 有两种机制在起作用。 首先,每条记录都有一个锁定字节,指示它当前是否被锁定。字节的值指向块头中的事务,因此会话可以确定锁是自己的还是属于另一个会话。 如果读取看到字节已设置,则它使用块头中的指针查找块的旧版本。如果仍处于锁定状态,则它将继续跟踪指针,直到到达记录显示为未锁定的块的版本。然后返回值。 同样的机制也用于基于时间的一致性。如果select在下午3点开始,并在下午3点02分发现一个被修改的块,那么它将跟踪历史返回以查找3点时当前的块版本。然后,它可能会发现它想要的记录在下午3:00被锁定[可能在下午3:01提交],并且必须进一步返回以查看下午3:00提交的值是多少。 另一种保护机制是闩锁。当它读取一个块时,它会在读取期间使用一个锁存器。这将防止另一个进程(可能在另一个CPU上运行)在读取期间访问块(即进程A不能在线程B读取块的同时设置锁字节-它必须等待读取完成)。这些锁存是非常低级别的CPU操作,仅保持很短的持续时间。在一个单核/cpu盒上,不需要锁存,因为只有一个核,所以只有线程上的核可以同时执行。 |
![]() |
2
0
经过一些思考和实验,我相信DBMS并没有提供这样的价值完整性:
它很可能是在操作系统上实现的事务特性,或者更低级(机器、硬件)的事务特性。
更新:
不过,我并不打算将DBMS事务隔离现象的讨论与硬件提供的低级事务支持混为一谈。
更新2:
更新3:
msdn线程中Razvan Socol的答案 Is a half-written values reading prevented WITH (NOLOCK) hint? 提供一个脚本来捕获部分更新值的读取。该站点当前已关闭,我在此处重新生成以下代码: 1)创建一个测试表并填充其中的10行:
2个)
三)
好吧,这是SQL Server 2008 R2的SSM很快捕获了一堆半覆盖的值。
|
![]() |
hello_programmers · Mysql从其他表输出一列 1 年前 |
![]() |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
![]() |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |
![]() |
Popo · Sql查询:返回数据库中不可用的where条件 1 年前 |
|
Hamdan Nuramdani · 对账单中一周内不同表中的数据求和 1 年前 |
|
Kugelfisch · 用php为数据库加密数据 1 年前 |