【问题标题】:Read a Sequence value after insert with a trigger?使用触发器插入后读取序列值?
【发布时间】:2016-09-13 16:49:25
【问题描述】:

我正在使用 Pro*C 开发一个小型应用程序,但我对其中一个主要功能有疑问。

我对每个表的标识符都有一个自动递增触发器,因此在将行插入表之前,触发器会设置行的 id。

这里的问题是我想在一个 isert 之后检索序列的值(以获取插入的行的 id),但是当两个事务试图插入一行时会发生什么?如果我使用 read-commited 级别并在插入行并检索它的值后提交事务会导致任何问题吗?我该怎么办?谢谢!

【问题讨论】:

  • 您目前如何获得价值?通过查询currval(在同一个会话中,即使已提交),使用returning 子句或其他方式?
  • 我通过查询currval得到插入语句后的值
  • OK,做插入的两个事务在不同的会话中?它们是独立的,currval 是会话本地的。你真的有问题还是只是想知道你所做的是否安全?
  • 插入将在不同的会话中,我只是想知道什么是安全的方法。但是正如你所说,如果每个会话的值都是独立的,我不会有任何问题,对吧?
  • currval 对此非常安全

标签: sql oracle triggers sequence auto-increment


【解决方案1】:

两个会话独立插入行并引用currval 是安全的,因为它是会话本地的。

The documentation 并没有明确表示:

... 对 CURRVAL 的任何引用总是返回序列的当前值,即最后一次引用 NEXTVAL 返回的值。

在会话中对序列使用 CURRVAL 之前,必须先使用 NEXTVAL 初始化序列。

综合起来,它们表明它是安全的,但第一部分并没有明确表明它是当前会话中对 NEXTVAL 的最后一次引用。但是,它确实说:

多个用户可以同时访问一个序列,无需等待或锁定。

不过,获取ID不需要查询,可以使用the returning into clause

insert into your_table (col1, ...) values (:val1, ...)
returning id into :id;

【讨论】:

  • 感谢您的详细解答。我将在这里使用returning 子句。我不知道我可以将它与 Pro*C 一起使用。
猜你喜欢
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
相关资源
最近更新 更多