session bean里使用BMT事务,好象也不能跨多个方法????

03-12-19 j2eenb

我刚刚写了一个无状态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);
}
}
<p>

其中,方法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;
}
<p>

测试这段代码的表只有两个字段:

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");
<p>

那么肯定在执行到method1("00003","xx03")时会出错,但我发现test中

00001和00002这两条记录还是被插入进去了。

也就是说,用JTA,没有回滚事务

谁能解释为什么?

j2eenb
2003-12-19 15:44

我又实验了一下

刚才不能回滚,是因为我用在getConnection函数中,用的class.forName这种

传统方式,所以不行

换成使用DataSource以后,就好了。

谁知道为什么?