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

gigixkfeng 04-07-01

开发部署环境为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(),但是还是没有效果,根本没有执行这个方法

各位大虾,向数据库表中添加记录的这种事务应该是非常常见的
那位高手能够告诉我这个问题应该如何解决呀?急!!!!!