2010-09-06 41 views
0

我有兩個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(); 
      } 
     } 
    }); 

pauseProcessing() - 睡眠

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

您可能需要顯示您正在使用哪些代碼來幫助人們 – 2010-09-06 14:32:05

+0

您如何控制交易?你的兩個應用程序在同一個容器中運行嗎? – rsilva4 2010-09-06 14:36:30

+0

不,應用程序是分開的:第一個是基於tomcat的webservice,第二個是在另一個服務器上運行的java standalone – alex543 2010-09-06 14:38:48

回答

1

是否使用Connection.TRANSACTION_SERIALIZABLE也是第一個應用程序?看起來像第一個應用程序鎖表,所以第二個無法訪問它(無法啓動事務)。也許Connection.TRANSACTION_REPEATABLE_READ可能夠了?

也許你也可以配置第二個應用程序,當它不能訪問資源時不會拋出異常,而是等待它。

0

這聽起來好像您正在讀取未提交的數據。你確定你正在設置隔離級別嗎?

在我看來,你混合了來自兩個不同類別的常量:你不應該通過TransactionDefinition.ISOLATION_SERIALIZABLE而不是Connection.TRANSACTION_SERIALIZABLEsetIsolationLevel方法嗎?

爲什麼你要設置隔離級別呢? Oracle的默認隔離級別(讀取已提交)通常是一致性和速度之間的最佳折衷方案,應該很好地適用於您的情況。

+1

在Oracle中,會話永遠不會讀取其他會話的未提交數據。 – 2010-09-06 23:10:03