请教分布式事务的具体处理:急!!!!

J2EEacai
04-08-08 3 108

有两个无状态Bean,分别命名为BeanA和BeanB,BeanA中有方法AddA这个方法实现向表A中添加记录,BeanB中也有方法AddB这个方法实现向表B中添加记录,将BeanA和BeanB组成在一个事务中,这个事务写在Jsp页面中,
在Test.jsp页面中
try{
InitialContext initial=new InitialContext();
UserTransaction ut=(UserTransaction)initial.lookup("java:comp/UserTransaction"); //1
SessionAHome aHome=(SessionAHome)initail.lookup("BeanA"); //2
SessionA a=aHome.create();
SessionBHome bHome=(SessionBHome)initail.lookup("BeanB"); //2
SessionB b=bHome.create();

ut.begin(); //3
a.AddA(“LineA”);
//向表B中添加数据时错误
b.AddB(“LineB”);
ut.commit(); //4

}
catch(.....){
ut.rollback();
}

现在的问题是BeanB的添加操作不成功,但是事务不执行回退,也就是说表A中添加了新记录,这是为什么,怎么解决???

banq
2004-08-10 13:07

将Jsp中代码放到SLSB中执行,这段代码也需要事务支持的。

J2EEacai
2004-08-11 17:24

我的应用服务器使用的是OC4J,JTA在我的程序中根本不起作用,这是我的联系方式bpsa@sina.com.cn,applezhao@sohu.com,如果您方便,请多指教。下面是我在一个事务中使用一个connection都不能回滚的程序,为什么????
这个函数我放在了slsb中
test()
{
UserTransaction ut = ctx.getUserTransaction();
Connection con = null;
try {


Context ictx = new InitialContext();
DataSource datasource = (DataSource)ictx.lookup(GetDataServer().GetDBConnectionString());

con = datasource.getConnection();


}
}catch (Exception ex) {

try{
ut.begin();
Statement stmt = con.createStatement();
String insertStatement ="INSERT INTO SFILEDIRINFO (FILEDIRID,FDATTRVALUE,FDNAME,FDNO,FDOPERATE,FDPARENT,FDSNO,FDTYPE,PEOPLEID_FILEDIR) VALUES ('SFILEDIR_513','','TransDir',4.0,'','','005',1,'sPeopleID')";
stmt.executeUpdate(insertStatement);
stmt.close();

insertStatement ="INSERT INTO SFILEDIRINFO (FILEDIRID,FDATTRVALUE,FDNAME,FDNO,FDOPERATE,FDPARENT,FDSNO,FDTYPE,PEOPLEID_FILEDIR) VALUES ('SFILEDIR_5136','','TransDir',4.0,'','','005',1)";
Statement prepStmt1 = con.createStatement();

prepStmt1.executeUpdate(insertStatement);
prepStmt1.close();
ut.commit();
} catch (Exception ex)
{
ex.printStackTrace();
try {

ut.rollback();

}catch (Exception e)
{

e.printStackTrace();
}
}
}
}

J2EEacai
2004-08-11 17:25

我的应用服务器使用的是OC4J,JTA在我的程序中根本不起作用,这是我的联系方式bpsa@sina.com.cn,applezhao@sohu.com,如果您方便,请多指教。下面是我在一个事务中使用一个connection都不能回滚的程序,为什么????
这个函数我放在了slsb中
test()
{
UserTransaction ut = ctx.getUserTransaction();
Connection con = null;
try {


Context ictx = new InitialContext();
DataSource datasource = (DataSource)ictx.lookup(GetDataServer().GetDBConnectionString());

con = datasource.getConnection();


}
}catch (Exception ex) {

try{
ut.begin();
Statement stmt = con.createStatement();
String insertStatement ="INSERT INTO SFILEDIRINFO (FILEDIRID,FDATTRVALUE,FDNAME,FDNO,FDOPERATE,FDPARENT,FDSNO,FDTYPE,PEOPLEID_FILEDIR) VALUES ('SFILEDIR_513','','TransDir',4.0,'','','005',1,'sPeopleID')";
stmt.executeUpdate(insertStatement);
stmt.close();

insertStatement ="INSERT INTO SFILEDIRINFO (FILEDIRID,FDATTRVALUE,FDNAME,FDNO,FDOPERATE,FDPARENT,FDSNO,FDTYPE,PEOPLEID_FILEDIR) VALUES ('SFILEDIR_5136','','TransDir',4.0,'','','005',1)";
Statement prepStmt1 = con.createStatement();

prepStmt1.executeUpdate(insertStatement);
prepStmt1.close();
ut.commit();
} catch (Exception ex)
{
ex.printStackTrace();
try {

ut.rollback();

}catch (Exception e)
{

e.printStackTrace();
}
}
}
}