从java批量更新的两个不同表中的一个表中插入max + 1

Posted

技术标签:

【中文标题】从java批量更新的两个不同表中的一个表中插入max + 1【英文标题】:Insert max + 1 from one table in two different table in batch update from java 【发布时间】:2016-11-30 09:41:59 【问题描述】:

我需要在 2 个具有引用关系的表中自动递增值。我的要求是在两个表中插入数据:- 表 A = Rowid ,其他列 表 B = Rowid ,其他列 我需要在两个表中插入来自不同方法的数据。 目前,我采用了这种方法:- 一种。从表 A 中查询最大值并将其加 1。 湾。使用批量更新在步骤 1 中获得值的两个表中插入数据。 但是,方法的缺陷是,如果两个用户/线程同时调用此方法,它们最终可能具有相同的值,我将在表 A 上得到引用完整性错误,而表 B 将有 2 行具有相同的行 id。

我可以同步我的方法来避免这种情况,但是由于其他一些功能,我有多种不同的方法在做同样的事情。

执行此操作的理想方法是使用自动生成的列,但 DBA 不允许这样做。另外,这两个表之间的引用完整性需要由应用程序维护,DBA不允许实际约束。

我在 java 端使用 Spring jdbctemplate,在数据库端使用 DB2。但是,问题与 Poth 无关。

【问题讨论】:

请注意,我知道有很多问题看起来与此类似。但现在一个正在更新两个表,也来自外部进程。 我假设不能使用 SEQUENCE 或更高的隔离级别。对吗? @data_henrik 右 DBA 要求在应用程序代码中处理。 【参考方案1】:

SELECT MAX()+1 不是为大量并发事务创建序列的可接受方式。

DBA 拒绝使用 DB2 的并发特性,例如 ISOLATION LEVELIDENTITYSEQUENCE 对象是不幸的。

有一些可以使用的应用解决方法:

将第一条语句包装在 FINAL TABLE 中以返回插入的值,包括为 TableA.rowid 生成的 MAX()+1。

使用准备好的语句的返回键:

PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
PreparedStatement prepareStatement(String sql, String[] columnNames)

然后将返回的值应用到TableB.rowid

【讨论】:

完全同意你的看法。唉,许多人犯了这个 max + 1 的错误,而不是让系统管理自动增量并检索结果,这要归功于 final table ... 老兄把它调低一点。真的很可怜,你没有提到参照完整性。

以上是关于从java批量更新的两个不同表中的一个表中插入max + 1的主要内容,如果未能解决你的问题,请参考以下文章

jdbc实现批量给多个表中更新数据(解析Excel表数据插入到数据库中)

从同一个包更新和插入到 2 个不同的表

更新触发器以将两个不同表中的数据添加到审计表中

Azure 存储表中的批量插入

如何使用 Java Spring Boot 在不插入新值的情况下更新表中的现有值

SQL语句怎么同时往两个表中插入不同的记录