在我使用Wildfly 10、java 8、mysql、camel和hibernate的项目中
methodKO持久化实体orderEntity("ko"),调用methodOK并进入异常状态;methodOK持久化实体orderEntity("ok")
尽管在methodKO中有异常,但我希望在db中找到orderEntity("ok"),所以我用@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)注释了methodOK,但这不起作用
以下是配置文件的详细信息:
standalone-full-ha.xml:
<datasources>
<xa-datasource jndi-name="java:jboss/datasources/myDS" pool-name="myDS" enabled="true" use-ccm="true">
....
</datasources>persistence.xml:
<persistence-unit name="camel" transaction-type="JTA">
<jta-data-source>java:jboss/datasources/myDS</jta-data-source>
....MyBean:
@Stateless
public class MyBean {
@Inject
OrderDAO orderDAO;
private void methodKO() throws Exception {
orderDAO.create(new orderEntity("ko"));
methodOK();
throw new Exception("err");
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private void methodOK() {
orderDAO.create(new orderEntity("ok"));
}
}发布于 2017-02-22 07:12:48
根据EJB 3.1:
事务属性是与以下每种方法相关联的值:
a) bean的业务接口的方法
b)通过bean类无接口视图公开的方法
这意味着私有方法上的任何事务性注释都是无用的。
我会将这两个方法都定义为公共
@Stateless
public class MyBean {
@Inject
OrderDAO orderDAO;
public void methodKO() throws Exception {
orderDAO.create(new orderEntity("ko"));
methodOK();
throw new Exception("err");
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void methodOK() {
orderDAO.create(new orderEntity("ok"));
}
}这将是一个很好的实践,该bean将实现一个接口,该接口实际上包含这两个方法。
发布于 2017-02-23 21:15:06
首先,抛出一个选中的异常通常不会触发事务回滚,除非您在特定的异常类型上使用@ javax.ejb.ApplicationException(rollback = true)专门为此进行了配置。默认情况下,未检查异常会触发回滚。
由于Maciej很好地描述的原因,您需要改变您尝试实现此逻辑的方式。有几种方法可以实现您想要的行为:
丑陋的方式:
@Stateless
public class MyBean {
@Resource
private SessionContext sessionContext;
@Inject
OrderDAO orderDAO;
public void methodKO() throws Exception {
orderDAO.create(new orderEntity("ko"));
sessionContext.getBusinessObject(MyBean.class).methodOK();
throw new RuntimeException("err");
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void methodOK() {
orderDAO.create(new orderEntity("ok"));
}
}整洁的方式:
@Stateless
public class MyBean {
@Inject
OrderDAO orderDAO;
public void methodKO() throws Exception {
orderDAO.create(new orderEntity("ko"));
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void methodOK() {
orderDAO.create(new orderEntity("ok"));
}
}
@Stateless
public class MyBusinessBean {
@Inject
private MyBean myBean;
public void businessMethod() {
myBean.methodKO();
myBean.methodOK();
throw new RuntimeException("Trip rollback");
}
}https://stackoverflow.com/questions/42379378
复制相似问题