我正在重构企业应用程序的数据导入过程,并遇到了一个片段,我想找到一个更好的解决方案。导入数据时,我们必须为每个数据集创建一个唯一的实体,并且在字段中存在一个计数器,该计数器用于顺序分配此ID。您阅读该字段以获取下一个空闲ID,然后将其递增以准备下一次。
目前,这是在原始应用程序中用“ C”编写的两个步骤:
SELECT idnext FROM mytable; UPDATE mytable SET idnext = idnext + 1;
显然,如果多个进程执行相同的操作,则这里存在争用条件。
编辑:重要前提:我无法触摸数据库/字段定义,这排除了一个序列。
我们正在用perl重写,我想做同样的事情,但是更好。原子解决方案会很好。不幸的是,我的SQL技能有限,所以我转向集体智慧:-)
在这种特定情况下,如前所述,序列是正确的解决方案。但是,如果将来在某些情况下需要更新某些内容并在同一条语句中返回值,则可以使用以下RETURNING子句:
RETURNING
UPDATE atable SET foo = do_something_with(foo) RETURNING foo INTO ?
如果调用代码是PL / SQL,则替换?。具有本地PL/SQL变量;否则,您可以将其绑定为程序中的输出参数。
编辑:自从您提到Perl以来,类似这样的事情应该起作用(未经测试):
my $sth = $dbh->prepare('UPDATE mytable SET idnext = idnext + 1 returning idnext into ?'); my $idnext; $sth->bind_param_inout(1, \$idnext, 8); $sth->execute; # now $idnext should contain the value
请参阅DBI。