我正在使用配置为使用自治事务的Oracle存储过程插入一行。我想插入此记录,提交该事务,然后锁定新插入的记录,以便除了当前会话之外没有其他人可以修改它(在另一个事务中,显然,因为插入它的是自治的)。 / p>
在我有机会SELECT...FOR UPDATE
之前,如何确保没有其他人锁定此新记录?
使用Oracle 10g。
答案 0 :(得分:10)
不,您永远不能在事务之间保持锁定。您应该问自己的问题是您需要在insert
和select ... for update
之间发出提交的原因。该行被insert
锁定;如果您在提交之前完成了对该行所做的任何操作,那么您不必担心重新锁定该行。
答案 1 :(得分:2)
我的第一个偏好是在数据准备好供其他会话使用之前删除COMMIT。
或者,您可以设计应用程序,以确保新行仅被该事务锁定。
在表格中添加一个标记,例如VISIBLE
,默认'N'
。
插入行时,请使用默认值插入。
提交后,select
for update
,并将标志更新为'Y'
(这样当您的代码第二次提交时,它也将更新标志)。
修改您的应用,以便其他会话将忽略VISIBLE='N'
的行。