更新 table 语句

Update table statement

祝大家今天愉快。 我对 Oracle DB 12cr2 中的 UPDATE TABLE 语句有些困惑。 假设我们有 3 个用户:

  1. U1;
  2. U2;
  3. U3;

U1 有一个名为 TEST_1 的 table,U2 和 U3 都对该 table 具有更新权限。

我的问题是:如果 U2 和 U3 尝试同时更新特定 table 中的相同行,会发生什么情况? Oracle 将如何控制此类进程?

提前致谢

简而言之,三个用户中的一个将在更新 table 时获得锁(以微秒差异首先执行查询的用户为准),其余两个用户必须等待 U1提交并释放锁,所以现在 U2 或 U3 将获得更新的数据以进行处理。

另一篇文章的片段:

提交

当向数据库发出 COMMIT 语句时,事务已结束,并且以下结果为真:

事务完成的所有工作都将永久化。 其他用户可以看到交易所做的数据更改。 释放事务获取的任何锁。

虽然第一个回答已经很好地解释了什么是锁定机制,但让我补充一点信息。

对于您的情况,我们正在谈论行锁 (TX)。 Row-level 锁主要用于防止两个事务修改同一行。当事务需要修改一行时,获取行锁。

语句或事务持有的行锁数量没有限制,Oracle不会将锁从行级别升级到更粗粒度。行锁定提供了可能的最细粒度锁定,因此提供了可能的最佳并发性和吞吐量。

当两个事务(在您的情况下为更新)攻击同一行时,第一个事务将获取锁,并且在提交或回滚之前不会释放锁。系统更改号 (SCN) 是 Oracle 数据库使用的逻辑内部时间戳,将分配给每个事务。系统更改编号或 SCN 对数据库中发生的事件进行排序,这是满足事务的 ACID 属性所必需的。

SCN 以单调递增的顺序出现。 Oracle 数据库可以像时钟一样使用 SCN,因为观察到的 SCN 指示逻辑时间点和重复观察值 return 等于或大于值。如果一个事件的 SCN 比另一个事件的 SCN 低,那么它发生在相对于数据库的较早时间。多个事件可能共享相同的 SCN,这意味着它们在数据库方面同时发生。

每笔交易都有一个SCN。例如,如果事务更新了一行,那么数据库会记录发生此更新的 SCN。此事务中的其他修改具有相同的 SCN。当事务提交时,数据库会为这次提交记录一个SCN。

Oracle 数据库递增系统全局区域 (SGA) 中的 SCN。当事务修改数据时,数据库将新的 SCN 写入分配给该事务的撤消数据段。日志写入进程然后立即将事务的提交记录写入联机重做日志。提交记录具有事务的唯一 SCN。 Oracle 数据库还使用 SCN 作为其实例恢复和介质恢复机制的一部分。

当两个事务同时发生时,比如同一秒,时间戳较早的事务获得锁。请记住,TIMESTAMP 存储 fractional_seconds_precision,它指定秒的小数部分的位数。该分数可以是 0 到 9 范围内的数字。