我正在研究一个使用DB2作为其主数据库的多线程应用程序.在过去,我们主要使用Identity列来表示我们需要自动生成的唯一标识符的表.为此,我们将在同一事务中运行以下2个查询:
INSERT INTO tbname (IDENTITY_COL,...) VALUES (DEFAULT,...); SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1;
我们现在被迫改为切换到Sequence.我知道你可以在INSERT和SELECT语句中使用“NEXT VALUE FOR colname”,但是我无法弄清楚INSERT和SELECT如何使用相同的值而不会在多线程应用程序中冒着竞争条件的风险.例如,如果我使用:
INSERT INTO tbname (SEQUENCE_COL,...) VALUES (NEXT VALUE FOR SEQUENCE_COL,...); SELECT PREVIoUS VALUE FOR SEQUENCE_COL;
然后有可能在上面的INSERT和SELECT之间运行另一个INSERT,因此为我提供了不正确的值.如果我尝试:
SELECT NEXT VALUE FOR SEQUENCE_COL;
将值存储在变量中并将其传递给INSERT:
INSERT INTO tbname (SEQUENCE_COL,...) VALUES (variable_value,...);
然后有可能另一个线程获得相同的NEXT VALUE并尝试插入相同的值,从而导致DB2 -803错误.是否可以在多线程环境中使用SEQUENCE列,或者我是否需要争取保留我的IDENTITY列?
解决方法
原文地址:https://www.jb51.cc/mssql/77493.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。