【问题标题】:Disabling database transaction in stateless bean在无状态 bean 中禁用数据库事务
【发布时间】:2019-01-18 21:15:50
【问题描述】:

WildFly 14 中,我有一个@Stateless bean,它使用不同的连接/数据库运行两个选择:

InitialContext context = new InitialContext();
DataSource ds = (DataSource)context.lookup("jndi/to/db/1");
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from table1"); // table1 in db 1

.........
.........

InitialContext context2 = new InitialContext();
DataSource ds2 = (DataSource)context.lookup("jndi/to/db/2");
Connection conn2 = ds2.getConnection();  // <-- here it fails
Statement stmt2 = conn2.createStatement();
ResultSet rs2 = stmt2.executeQuery("select * from table2"); // table2 in db 2

我在第二次选择中收到警告(也失败了):

ARJUNA012140: Adding multiple last resources is disallowed

根据这个link,问题是我正在使用两个不同的数据库运行一个事务。请注意,数据源未配置 XA 选项,因为在我的应用程序中没有用例在单个事务中更新两个数据库。

我遇到问题的 bean 是只读的,它只执行两个 SQL 选择。

我尝试使用以下方法注释 bean 方法:

@TransactionAttribute(javax.ejb.TransactionAttributeType.NEVER) 

但我得到运行时错误:

WFLYEJB0063: Transaction present on server in Never call (EJB3 13.6.2.6)

为什么会出现交易?如何禁用它?

【问题讨论】:

    标签: java jakarta-ee wildfly java-ee-8


    【解决方案1】:

    而不是@TransactionAttribute(javax.ejb.TransactionAttributeType.NEVER)

    用途:

    @TransactionAttribute(javax.ejb.TransactionAttributeType.NOT_SUPPORTED)

    这使得无状态 Bean 避免将自己附加到当前正在运行的事务中;并像根本没有事务一样运行......

    为什么会出现交易?

    我真的不知道...在调用无状态 Bean 之前,您是否调用了任何其他 J2EE 组件(例如,使用 @Transactional 注释的 CDI bean 或其他 EJB)?

    【讨论】:

    • 我最终使用@TransactionManagement(TransactionManagementType.BEAN) 通过 UserTransaction 手动启动事务。问题是在同一个bean中,一些方法是只读的,而另一些方法有更新,所以我不能使用NOT_SUPPORTED。我仍然不知道为什么在 CMT 中 connect 方法会启动事务,而我在任何地方都没有 @Transactional
    猜你喜欢
    • 2014-04-06
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多