首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Wildfly - @TransactionAttribute -

Wildfly - @TransactionAttribute -
EN

Stack Overflow用户
提问于 2017-02-22 06:41:32
回答 2查看 939关注 0票数 1

在我使用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:

代码语言:javascript
复制
<datasources>
<xa-datasource jndi-name="java:jboss/datasources/myDS" pool-name="myDS" enabled="true" use-ccm="true">
....
</datasources>

persistence.xml:

代码语言:javascript
复制
<persistence-unit name="camel" transaction-type="JTA">
<jta-data-source>java:jboss/datasources/myDS</jta-data-source>
....

MyBean:

代码语言:javascript
复制
@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"));
    }

}
EN

回答 2

Stack Overflow用户

发布于 2017-02-22 07:12:48

根据EJB 3.1:

事务属性是与以下每种方法相关联的值:

a) bean的业务接口的方法

b)通过bean类无接口视图公开的方法

这意味着私有方法上的任何事务性注释都是无用的。

我会将这两个方法都定义为公共

代码语言:javascript
复制
@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将实现一个接口,该接口实际上包含这两个方法。

票数 0
EN

Stack Overflow用户

发布于 2017-02-23 21:15:06

首先,抛出一个选中的异常通常不会触发事务回滚,除非您在特定的异常类型上使用@ javax.ejb.ApplicationException(rollback = true)专门为此进行了配置。默认情况下,未检查异常会触发回滚。

由于Maciej很好地描述的原因,您需要改变您尝试实现此逻辑的方式。有几种方法可以实现您想要的行为:

丑陋的方式:

代码语言:javascript
复制
@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"));
    }

}

整洁的方式:

代码语言:javascript
复制
@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");
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42379378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档