我刚刚写了一个无状态SESSION BEAN,
没有使用CMT(容器管理的事务),而是用的BMT,主要代码如下:
public void addData() { UserTransaction tx =null; try{ InitialContext ctx = new InitialContext(); tx = (UserTransaction)ctx.lookup("java:comp/UserTransaction"); tx.begin(); if(method1("00001","xx01")!=1) throw new Exception("1 insert fail!"); if(method1("00002","xx02")!=1) throw new Exception("2 insert fail!"); if(method1("00003","xx03")!=1) throw new Exception("3 insert fail!"); tx.commit(); }catch(Exception ex){ try{ if(tx!=null)tx.rollback(); }catch(Exception e){} ex.printStackTrace(System.out); } }
|
其中,方法method1很简单,仅仅是一个向数据库表的一个插入,代码如下:
public int method1(String id,String name) { Connection conn = null; Statement stmt = null; try{ conn = getConnection(); String sql="insert into test values('"+id+"','"+name+"')"; stmt=conn.createStatement(); int count = stmt.executeUpdate(sql); if(count!=1) throw new Exception("sql error:"+sql); System.out.println("method1.....execute sql:"+sql); return 1; }catch(Exception ex){ ex.printStackTrace(System.out); }finally{ try{ if(conn!=null&&!conn.isClosed())conn.close(); conn = null; } catch(Exception ex){} try{stmt.close();stmt=null;}catch(Exception ex){}; } return 0; }
|
测试这段代码的表只有两个字段:
create table(
id varchar(5) not null primary key,
name varchar(20)
)在这个BEAN里,我在方法addData中使用JTA的事务,我发现事务没有回滚,
比如,test表中已经有了一条记录,id是00003,在addData()中,连续执行:
method1("00001","xx01"); method1("00002","xx02"); method1("00003","xx03");
|
那么肯定在执行到method1("00003","xx03")时会出错,但我发现test中
00001和00002这两条记录还是被插入进去了。
也就是说,用JTA,没有回滚事务谁能解释为什么?