java和ibatis一樣,只要執行executeXXX()方法以後,預設自動認可事務,意味著每次調用executeXXX()方法,就是一個獨立事務,但對於有些情況,比如轉賬,但從一個賬戶上把錢扣掉(其實是邏輯上刪除了一條記錄),在另一個賬戶增加存款額(其實是修改了記錄),這2個操作應該是一個事務,要麼發生,要麼不發生,此時就應該把這2個操作定義為一個事務。
1、java只要把事務操作設定為不自動認可,通過手動提交就能實現事務的處理,代碼如下:
package com.oracle;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;/** * java事務控制 * @author Administrator * */public class TestTrans {/** * @param args */public static void main(String[] args) {Connection ct = null;try{Class.forName("oracle.jdbc.driver.OracleDriver");ct = DriverManager.getConnection("jdbc:oracle:thin:@172.17.40.227:1521:orcl","scott","tiger");Statement sm = ct.createStatement();//加入交易處理ct.setAutoCommit(false);sm.executeUpdate("update emp set sal=sal-100 where ename='SCOTT'");//int i = 7/0;sm.executeUpdate("update emp set sal=sal+100 where ename='SMITH'");;//提交事務ct.commit();}catch(Exception e){//如果發生異常就復原try{ct.rollback();}catch(Exception ex){ex.printStackTrace();}e.printStackTrace();}finally{ sm.close(); ct.close();}}}
2、ibatis主要通過SqlMapClient類中的startTransaction()、commitTransaction()、endTransaction()、rollbackTransaction()這四個方法來實現事務的開始、提交、結束和回退。例子代碼如下:
private Reader reader = new Resources.getResourceAsReader( "com/ibatis/example/sqlMapconfig.xml"); private SqlMapClient sqlMap = XmlSqlMapBuilder.buildSqlMap(reader); public updateItemDescription (String itemId, String newDescription) throws SQLException { try { sqlMap.startTransaction (); Item item = (Item) sqlMap.queryForObject ("getItem", itemId); item.setDescription (newDescription); sqlMap.update ("updateItem", item); sqlMap.commitTransaction (); } finally { sqlMap.endTransaction (); } }
注意:事務不能嵌套。在調用 commit()或 rollback()之前,從同一線程多次調用.startTransaction,將引起拋出例外。換句話說,對於每個 SqlMap 執行個體,每個線程最多隻
能開啟一個事務。