gpt4 book ai didi

java.sql.SQLIntegrityConstraintViolationException : ORA-00001: unique constraint while running Oracle functions

转载 作者:行者123 更新时间:2023-11-30 04:07:42 26 4
gpt4 key购买 nike

使用 mybatis 运行 oracle 函数时,出现 java.sql.SQLIntegrityConstraintViolationException: ORA-00001: 唯一约束错误。我将 spring 事务配置为在 Serialized 中运行,并且 readOnly false。下面是我的映射器类

public interface ILockMapper {

@Transactional(isolation=Isolation.SERIALIZABLE, readOnly=false)
String aquireLock(final SpInOutFields input);

@Transactional(isolation=Isolation.SERIALIZABLE, readOnly=false)
String releaseLock(final SpInOutFields input);

}

我的aquireLock方法运行我的oracle函数,oracle函数有两个插入语句。在插入数据之前,我使用给定数据的 select count(*) 检查数据是否存在。如果存在,我不会插入数据,示例 pl sql 语句如下

SELECT COUNT(*) INTO rowcount FROM kp_lock WHERE device_id = deviceId; 


if rowcount = 0 then
INSERT INTO kp_lock(device_id,lock_flag,request_time) values ( deviceId, 'YES', CURRENT_TIMESTAMP);
status := threadSysId;
else
status := '';
end if;

当我从 oracle 运行该函数时,它工作正常。当我运行单线程时它工作正常,但当我运行多线程时它会失败。

我的 JUNIT 测试类如下,

    @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:config/spring-context.xml"})
public class TestSerialization {

@Autowired
ApplicationContext context;

@Test
public void testSerialize() throws InterruptedException{

MultiThread multithread = context.getBean(MultiThread.class);
MultiThread multithread1 = context.getBean(MultiThread.class);

Thread thread = new Thread(multithread);
Thread thread1 = new Thread(multithread1);

thread.start();

if(multithread == multithread1){
System.out.println("Both refer same instance");
}

thread1.start();

try {
thread.join();
thread1.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

有人可以帮我配置事务以同步方式运行吗?不知道哪里错了

最佳答案

问题在于函数的非原子性,这会导致竞争条件。在多线程环境中,在检查记录是否存在和插入发生之间可能会执行一些其他线程。

仅通过事务配置无法解决此问题。您需要做的是insert conditionally .

您似乎正在尝试实现自定义锁。考虑使用User Defined Locks

关于java.sql.SQLIntegrityConstraintViolationException : ORA-00001: unique constraint while running Oracle functions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20369765/

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