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 实例,每个线程最多只 能打开一个事务。