[问题]关于create()有关的事务问题

04-07-01 gigixkfeng
开发部署环境为weblogic8.1 + Jbuilder 9

实现功能:在一个stateless session bean中调用一个CMP方式的Entity Bean

来向数据库中添加两条数据,如果这两条数据主键相同,那么回滚事务

SessionBean 和 EntityBean中的所有方法事务属性都是Required

SessionBean中代码如下,

其中home是EntityBean的LocalHome接口的实例,Product是EntityBean的Local接口

try {

Product product = home.create(new Integer(2));

} catch (Exception e) {

System.out.println(e.getMessage());

sessionContext.setRollbackOnly();

}

try {

Product product2 = home.create(new Integer(2));

} catch (Exception e) {

System.out.println(e.getMessage());

sessionContext.setRollbackOnly();

}

运行结果是服务器端抛出异常,是一个封装好的

javax.transaction.TransactionRollBackException

里面封装了一个weblogic.utils.RunTime......的异常,具体名字忘了

里面又封装了一个javax.ejb.DuplicateKeyException的异常

关键问题是我的上面的代码根本没有捕获到任何异常,所以两个

输出语句和事务回滚语句也就跟着失效了

异常可以在调用Sessionbean的客户端捕捉到,好像容器直接跳过

Sessionbean直接把异常抛给了上一层

察看数据库,SessionBean中的事务没有回滚,第二条(!!!)记录插入到了数据库表中

这个问题困扰了我很长时间,不知道应该如何实现呀?

曾经试过SessionSynchronization接口,在beforeCompletion方法中

加入sessionContext.setRollbackOnly(),但是还是没有效果,根本没有执行这个方法

各位大虾,向数据库表中添加记录的这种事务应该是非常常见的

那位高手能够告诉我这个问题应该如何解决呀?急!!!!!

猜你喜欢