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

04-08-08 J2EEacai

有两个无状态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();

}

}

}

}