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

我刚刚写了一个无状态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,没有回滚事务

谁能解释为什么?

我又实验了一下
刚才不能回滚,是因为我用在getConnection函数中,用的class.forName这种
传统方式,所以不行
换成使用DataSource以后,就好了。

谁知道为什么?