Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency DB2选择插入并发问题_Concurrency_Insert_Db2_Locking - Fatal编程技术网

Concurrency DB2选择插入并发问题

Concurrency DB2选择插入并发问题,concurrency,insert,db2,locking,Concurrency,Insert,Db2,Locking,我是DB2新手,有一个问题:2+独立测试进程正在同一个表中创建新的测试数据记录。要做到这一点,我必须从这个表中获取最后一个现存的最大ID,增加它,并为新记录使用它。由于某些原因,最小ID必须为1000。没有属于ID列的序列,也没有任何其他自动机制,但它当然必须是唯一的 我写了以下SQL语句: SELECT ID FROM FINAL TABLE( INSERT INTO table_x (ID,NAME) VALUES((SELECT COALESCE(MAX_ID, 1000) MAX

我是DB2新手,有一个问题:2+独立测试进程正在同一个表中创建新的测试数据记录。要做到这一点,我必须从这个表中获取最后一个现存的最大ID,增加它,并为新记录使用它。由于某些原因,最小ID必须为1000。没有属于ID列的序列,也没有任何其他自动机制,但它当然必须是唯一的

我写了以下SQL语句:

SELECT ID FROM FINAL TABLE(
  INSERT INTO table_x (ID,NAME)
  VALUES((SELECT COALESCE(MAX_ID, 1000) MAX_ID FROM (
    SELECT * FROM (SELECT MAX(ID) AS MAX_ID FROM table_x))
  )+1,'Ben')
)
该语句可以工作,但由于相同的ID,在仍然存在并发性问题的时候多次运行该语句

显然,我必须做更多的事情。我想表锁定可能是一个解决方案,或者可能还有其他最佳实践?我找到了一些关于NEXTVAL的文章,但它只适用于序列

是的,我找到了这个,但我并没有找到解决我的问题的办法


谢谢你的提示

这种设计不会扩展,您应该重新创建表,以使用默认情况下始终生成的标识列。否则,请尝试使用语句级隔离来影响锁定,例如:从最终表插入到表_xid中选择ID,从表_x中选择名称值COALESCEMAXID,从带有RR“Ben”的表_x中选择1000+1。您也可以尝试使用RS。可能您正在使用默认隔离。谢谢。但不幸的是,测试人员常常不得不接受现有的环境,因此没有机会改变表的设计。我试着用RS。默认隔离。。到目前为止,我还不知道背后的概念。使用这种方法,竞争条件是不可避免的,除非您愿意通过锁定超出需要的部分来牺牲并发性。没有什么可以阻止您为测试目的创建一个序列,并使用它生成值。