Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 插入期间数据库删除失败_Java_Oracle_Transactions - Fatal编程技术网

Java 插入期间数据库删除失败

Java 插入期间数据库删除失败,java,oracle,transactions,Java,Oracle,Transactions,我有两个java应用程序:其中一个将记录插入表1。 第二个应用程序读取前N项并删除它们。 当第一个应用程序插入数据密集型时,当我尝试删除带有CannotSerializeTransactionException的任何行时,第二个应用程序失败。我看不到任何问题:只有在插入事务完成时,插入的项目才会在选择/删除中可见。我怎样才能修好它?谢谢 TransactionTemplate tt = new TransactionTemplate(platformTransactionManager);

我有两个java应用程序:其中一个将记录插入表1。 第二个应用程序读取前N项并删除它们。 当第一个应用程序插入数据密集型时,当我尝试删除带有CannotSerializeTransactionException的任何行时,第二个应用程序失败。我看不到任何问题:只有在插入事务完成时,插入的项目才会在选择/删除中可见。我怎样才能修好它?谢谢

 TransactionTemplate tt = new  TransactionTemplate(platformTransactionManager);  
    tt.setIsolationLevel(Connection.TRANSACTION_SERIALIZABLE);
    tt.execute(new TransactionCallbackWithoutResult() {                
    @Override
    protected void doInTransactionWithoutResult(TransactionStatus status) {
        List<Record> records = getRecords(); // jdbc select
        if (!records.isEmpty()) {
           try {
              processRecords(records); // no database
              removeRecords(records); // jdbc delete - exception here
           } catch (CannotSerializeTransactionException e) {
                 log.info("Transaction rollback");
            }
         } else {
           pauseProcessing();
             }
        }
   });
TransactionTemplate tt=新的TransactionTemplate(platformTransactionManager);
tt.setIsolationLevel(Connection.TRANSACTION_SERIALIZABLE);
tt.execute(newtransactioncallbackwithoutresult(){
@凌驾
受保护的void doInTransactionWithoutResult(事务状态){
List records=getRecords();//jdbc select
如果(!records.isEmpty()){
试一试{
processRecords(记录);//没有数据库
removeRecords(records);//jdbc delete-此处异常
}捕获(不能序列化TransactionException e){
log.info(“事务回滚”);
}
}否则{
暂停处理();
}
}
});
pauseProcessing()-睡眠

public void removeRecords(int changeId) { String sql = "delete from RECORDS where ID <= ?";
        getJdbcTemplate().update(sql, new Object[]{changeId});}

public void removeecords(int changeId){String sql=“delete from RECORDS where ID您使用的是
连接吗。事务\u SERIALIZABLE
也在第一个应用程序中?看起来像是第一个应用程序锁定了表,所以第二个应用程序无法访问它(无法启动事务)。可能是
连接。事务\u可重复\u读取
就足够了吗


也许您还可以将第二个应用程序配置为在无法访问资源时不引发异常,而是等待异常。

这听起来好像您正在读取未提交的数据。您确定正确设置了隔离级别吗

在我看来,您似乎混淆了来自两个不同类的常量:您不应该将
TransactionDefinition.ISOLATION_SERIALIZABLE
而不是
Connection.TRANSACTION_SERIALIZABLE
传递到
setIsolationLevel
方法吗


为什么还要设置隔离级别?Oracle的默认隔离级别(读取已提交)通常是一致性和速度之间的最佳折衷方案,在您的情况下应该可以很好地发挥作用。

您可能需要显示您正在使用哪些代码来帮助人们如何控制事务?您的两个应用程序是否在同一个容器中运行?不,应用程序是分开的:第一个是基于tomcat的webservice,第二个是在anot上运行的java单机版她的服务器在
removeRecords()
pauseProcessing()
中发生了什么?在Oracle中,一个会话永远无法读取另一个会话的未提交数据。