在Spring一統天下的情況下,JDBC快沒有生存余地了。不過JDBC還是Java操作數據庫的基礎,現在Java項目中JDBC的應用快絕跡了,有必要對JDBC的事務編程模型做個象征性的總結。
下面是示例,保證代碼可以編譯,但不保證能運行,呵呵。
import Java.sql.*;
/**
* JDBC編程事務控制模型備忘
*
* @author : leizhimin,2008-8-21 14:48:42。
*/
public class JdbcTxText {
public static void main(String[] args) {
test();
}
public static void test() {
Connection conn = null;
//定義一個回滾點
Savepoint savepoint1 = null;
try {
//獲取一個數據庫連接
conn = DriverManager.getConnection("url", "user", "passWord");
//設置不自動提交,相當於開啟了事務
conn.setAutoCommit(false);
//設置JDBC事務的級別
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
//創建一個用於執行靜態 SQL 語句並返回它所生成結果的對象
Statement stmt = conn.createStatement();
//執行連個SQL語句,在同一個事務中
stmt.executeUpdate("insert into test values(1,'aaa')");
//定義一個回滾到(保存點)savepoint1,在事務失敗的時候,可以回滾到定義的回滾點
savepoint1 = conn.setSavepoint("insert_end");
stmt.executeUpdate("update test set name = 'bbb' where id =1");
//提交事務
conn.commit();
} catch (SQLException e) {
try {
//當事務失敗時候,回滾到(保存點)savepoint1
conn.rollback(savepoint1);
// 當本事務中的插入和更新SQL其中一個執行異常的時候,整個事務回滾
//conn.rollback();
} catch (SQLException e1) {
throw new RuntimeException("回滾事務發生異常!", e);
}
throw new RuntimeException("執行事務發生異常!", e);
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
throw new RuntimeException("關閉數據庫連接發生異常!", e);
}
}
}
}
}
上面代碼中:
//設置JDBC事務的級別
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
//當事務失敗時候,回滾到(保存點)savepoint1
conn.rollback(savepoint1);
JDBC的事務級別設置,保存點(或回滾點)的設置與數據庫和JDBC的驅動的實現有關系,並非完全支持,但是不支持也不會出錯。