如果不同用户对该块进行多次更改,如何在脏块中管理行锁?
How the row locks are managed in dirty blocks if there are multiple changes by different users on that block?
我对脏块有疑问。如您所知,一个块中有多行。如果多个用户对同一个块的不同行进行操作,oracle会不会为每笔交易创建特定的脏块?
或者,如果事务只是修改了那个块中的一行,那么脏块会不会只包含一行数据?
那么,在这种情况下,oracle是执行行级锁,还是块级锁?
据我所知,即使我们只更改一个块中的一行,数据库也会将完整的行加载到缓冲区缓存并将其命名为脏。因此假设,三个用户更改了同一块的三个不同行。然后,一个执行回滚,另一个执行提交,最后一个仍然进行更改。那么在这种情况下,数据库将如何管理该块及其操作?
最佳。
Oracle 通过 SCN(系统更改编号)、UNDO 表空间和(用于锁定的)块的 ITL(感兴趣的事务列表)部分自动处理此问题 header.
当您通过 DML 语句对数据进行更改时,oracle 将更改写入相关块(将相关行标记为在每个块的 ITL 部分中锁定 header)以及撤消事务到 UNDO 表空间的方法。每次提交时,每个块都会更新其 SCN。
现在假设您是 运行 一个查询(数据库知道它在 SCN #1),但是有人更改了块,所以它现在在 SCN #2。当您的查询检索到该块时,Oracle 知道它需要将数据回滚到它在 SCN #1 时的状态 - 它通过使用 UNDO 表空间中的信息将数据返回到特定的 SCN 来执行此操作。
这都是读取一致性的一部分,您可以在 this ASKTOM answer, and more about locking of rows here 中阅读有关 SCN 的更多信息。
我对脏块有疑问。如您所知,一个块中有多行。如果多个用户对同一个块的不同行进行操作,oracle会不会为每笔交易创建特定的脏块?
或者,如果事务只是修改了那个块中的一行,那么脏块会不会只包含一行数据?
那么,在这种情况下,oracle是执行行级锁,还是块级锁?
据我所知,即使我们只更改一个块中的一行,数据库也会将完整的行加载到缓冲区缓存并将其命名为脏。因此假设,三个用户更改了同一块的三个不同行。然后,一个执行回滚,另一个执行提交,最后一个仍然进行更改。那么在这种情况下,数据库将如何管理该块及其操作?
最佳。
Oracle 通过 SCN(系统更改编号)、UNDO 表空间和(用于锁定的)块的 ITL(感兴趣的事务列表)部分自动处理此问题 header.
当您通过 DML 语句对数据进行更改时,oracle 将更改写入相关块(将相关行标记为在每个块的 ITL 部分中锁定 header)以及撤消事务到 UNDO 表空间的方法。每次提交时,每个块都会更新其 SCN。
现在假设您是 运行 一个查询(数据库知道它在 SCN #1),但是有人更改了块,所以它现在在 SCN #2。当您的查询检索到该块时,Oracle 知道它需要将数据回滚到它在 SCN #1 时的状态 - 它通过使用 UNDO 表空间中的信息将数据返回到特定的 SCN 来执行此操作。
这都是读取一致性的一部分,您可以在 this ASKTOM answer, and more about locking of rows here 中阅读有关 SCN 的更多信息。