我在Pro * C中开发了一个小应用程序,但我对其中一个主要功能有疑问。
我有一个自动增量触发器用于每个表的标识符,所以在将行插入表之前,触发器设置行的id。
这里的问题是我想在isert之后检索序列的值(以获取插入的行的id),但是当两个事务试图插入一行时会发生什么?如果我使用read-commited级别并在插入行后提交事务并检索它的值会导致任何问题?我该怎么办?谢谢!
答案 0 :(得分: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;