gpt4 book ai didi

sql - 如何处理具有多个批量插入的表的主键?

转载 作者:行者123 更新时间:2023-12-03 12:55:36 24 4
gpt4 key购买 nike

我之前正在开发一个实时填充 ODS 的应用程序。只要确定给定表的所有记录都是正确的,就会调用特定于每个表的 PK 的序列对象来生成 PK。一旦返回,它将存储在一个 Map 中,以供同一 session 中其他表的 FK 引用使用;它是直接插入的,不是自动生成的。我知道该序列是线程安全的,因为
一位 friend 提到,在他之前在另一家公司的一个项目中,他们使用批处理并简单地使用最大索引 +1 的范围,直到要插入的行数。但是,这些表被锁定在应用程序的一个实例中,而不是集群中。
假设有人希望对同一表集契约(Contract)时支持批处理和实时操作。使用存储过程可以:

  1. 锁定序列对象。
  2. 按行数的参数递增它。
  3. 将最后一个值存储在临时变量中。
  4. 解锁序列对象。
  5. 最后,返回临时变量。

我对这个想法的第一个问题是,除非可以阻止锁定序列的命令,否则没有什么可以阻止此存储过程同时运行多次。如果有人可以提供主要在 Java 端的更好解决方案,我会添加 J2E 标记。

最佳答案

您无法锁定 DB2 SEQUENCE ,你也不需要。 DB2 引擎处理序列同步并保证每个并发 session 接收到不冲突的序列值。

对于批量插入,您可以将序列缓存设置为批量大小,这会显着提高并发性。

您可以通过多种方式获取最后生成的序列值作为外键值重复使用。最简单的是使用 PREVIOUS VALUE FOR <sequence name>表达式并将结果存储在应用程序变量中。另一种方法是查询 INSERT数据更改表 :

SELECT id INTO :my_fk_variable FROM FINAL TABLE (
INSERT INTO my_table (id, something)
VALUES (NEXT VALUE FOR my_sequence, 'whatever'))

关于sql - 如何处理具有多个批量插入的表的主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27905753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com