从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 LEVEL
、IDENTITY
或 SEQUENCE
对象是不幸的。
有一些可以使用的应用解决方法:
将第一条语句包装在 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表数据插入到数据库中)