加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 如何在多线程应用程序中获取DB2序列值

发布时间:2020-12-12 06:55:20 所属栏目:MsSql教程 来源:网络整理
导读:我正在研究一个使用DB2作为其主数据库的多线程应用程序.在过去,我们主要使用Identity列来表示我们需要自动生成的唯一标识符的表.为此,我们将在同一事务中运行以下2个查询: INSERT INTO tbname (IDENTITY_COL,...) VALUES (DEFAULT,...);SELECT IDENTITY_VAL_
我正在研究一个使用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列?

解决方法

除了Michael Sharek(正确)所说的:
INSERT INTO tbname (SEQUENCE_COL,...);
SELECT PREVIOUS VALUE FOR SEQUENCE_COL;

你的假设然后有可能在上面的INSERT和SELECT之间运行另一个INSERT,因此为我提供了错误的值“关于上述语句序列是不正确的.

“下一个值”和“前一个值”是特定于连接的.

从不同线程访问序列永远不会产生“竞争”条件.每个连接都有一个完全隔离的序列“环境”.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读