gpt4 book ai didi

java - 使用 Java 和 Oracle 数据库时出现奇怪的唯一约束错误

转载 作者:行者123 更新时间:2023-11-30 04:35:39 25 4
gpt4 key购买 nike

我有一个名为 CUSTOMERS 的表,其中包含以下列:

CUSTOMER_ID (NUMBER)、DAY(DATE)、REGISTERED_TO(NUMBER)

表中还有更多列,但这与我的问题无关,因为只有上述列一起定义为主键

在我们的应用程序中,我们对该表进行了大量插入,因此我们不使用MERGE,而是使用以下语句:

INSERT INTO CUSTOMERS  (CUSTOMER_ID , DAY, REGISTERED_TO)                      
SELECT ?, ?, ?
FROM DUAL WHERE NOT EXISTS
(SELECT NULL
FROM CUSTOMERS
WHERE CUSTOMER_ID = ?
AND DAY = ?
AND REGISTERED_TO = ?
)";

我们使用 PreparedStatement 对象,利用批处理功能插入通过每个客户的应用程序流程收集的大量记录。

问题是有时我会收到以下错误:

ORA-00001: unique constraint (CUSTOMERS_PK) violated

奇怪的是,当我使用批量插入并逐条插入每条记录(通过简单地执行pstmt.execute())时,没有错误。

插入语句有问题吗? jdbc 驱动程序?我是否没有正确使用批处理机制?

这是我的插入循环的半伪代码:

  pstmt = conn.prepareStatement(statement);
pstmt.setQueryTimeout(90);

for each customer :
- pstmt.setObject(1, customer id);
- pstmt.setObject(2, current day);
- pstmt.setObject(3, registered to);
- pstmt.addBatch();
end for

pstmt.executeBatch();

它全部包含在 try/catch/finally block 中,确保在此过程结束时关闭语句和连接。

最佳答案

我猜您正在并行使用多个线程或进程,每个线程或进程都执行插入操作。在这种情况下,Oracle 的事务隔离功能会挫败您进行合并的尝试,因为有时必然会发生以下情况:

  • session A 运行您的语句,插入一行 (x,y,z)
  • session B 运行相同的语句,尝试插入行 (x,y,z),获取锁并等待
  • session A 提交
  • session B 收到“违反唯一约束”错误

这是因为在 session A 提交之前, session B 不会看到新行,因此它会尝试插入相同的行。

关于java - 使用 Java 和 Oracle 数据库时出现奇怪的唯一约束错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13586370/

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