簡體   English   中英

Sybase中的JDBC事務控制

[英]JDBC Transaction control in Sybase

在JAVA中的JDBC事務控制機制中需要幫助。

問題:

我們的Sybase DB中有某些存儲過程需要在非鏈接模式下運行。 由於我們正在兩個不同的數據庫(不幸的是,兩個Sybase)上更新數據,因此,如果出現任何故障,我們需要能夠回滾所有以前的事務。

但是以Unchained Mode(自動提交-開啟)運行並不能幫助我們進行回滾,因為某些SP已經提交了事務。

Connection connection = getConnection();
PreparedStatement ps = null;
try{
   String sql = getQuery(); // SQL Chained Mode 
   ps = connection.prepareStatement(sql); 
   ps.executeUpdate();        //Step 1
   .
   .
   sql = getTransctionQuery(); // SQL Unchained Mode
   connection.setAutoCommit(true);        //Step 2
   ps = connection.prepareStatement(sql); 
   ps.executeUpdate();
   connection.setAutoCommit(false);
   .
   .
   sql = getQuery(); // SQL Chained Mode 
   ps = connection.prepareStatement(sql);  
   ps.executeUpdate();     //Step 3 This step fails.
   connection.commit();
}catch(){
   connection.rollback(); //Doesn’t rollback step 1 and understandably step 2.
}
finally{
   connection.close();  //cleanup code
}

如果3失敗,我們理想地希望有效地回滾步驟1和步驟2。

當前解決方案

我們的想法是重新發明輪子並編寫我們自己的回滾版本(通過從Java刪除插入的記錄並還原更新的值)。

需要有效的解決方案

由於此解決方案需要大量的精力,而且並非萬無一失,因此我們想知道是否還有其他更好的解決方案。

謝謝

您需要執行一個明確的BEGIN TRANSACTION語句。 否則,每個DML本身就是您無法控制的事務。 顯然,自動提交也必須關閉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM