我对脏块有疑问。如您所知,一个块中有多行。如果多个用户在同一块中的不同行上进行操作,oracle将为每个事务创建特定的脏块吗?
或者,如果事务仅修改了该块中的一行,那么脏块将仅包含一行数据吗?
那么,在这种情况下,oracle将执行行级锁定还是块级锁定?
据我所知,即使我们仅更改一个块中的一行,数据库也会将完整内容加载到缓冲区高速缓存中并将其命名为脏。因此,假设三个用户更改了同一块的三个不同行。然后,一个执行回滚,另一个执行提交,最后一个仍然进行更改。那么在这种情况下,数据库将如何管理该块及其操作?
最好。
答案 0 :(得分:3)
Oracle通过SCN(系统更改号)加上UNDO表空间以及块头的ITL(感兴趣的事务列表)部分自动进行处理。
当您通过DML语句对数据进行更改时,oracle将更改写入相关块(将相关行标记为已锁定在每个块标题的ITL部分中),以及将事务撤消到以下位置的方式: UNDO表空间。每次提交时,每个块的SCN都会更新。
现在假设您正在运行查询(数据库知道该查询位于SCN#1),但是有人更改了该块,因此现在位于SCN#2。当您的查询检索到该块时,Oracle知道需要将数据回滚到SCN#1处的状态-通过使用UNDO表空间中的信息将数据工作回特定的SCN来实现。
这都是读取一致性的一部分,您可以在this ASKTOM answer中阅读有关SCN的更多信息,以及在行here中锁定有关的更多信息。