[英]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.