在下面的代码中,我试图强制特定 bean 的事务超时,将其事务时间设置为比方法完成所需的时间短。

超时设置为 3 秒 ,方法完成所需的时间为 5 秒

我正在使用一个便携式解决方案,它指的是 BMT 和使用 setTransactionTimeout 方法设置超时的组合。

我希望交易无效并向我抛出异常,但这并没有发生。

我究竟做错了什么?

@Singleton
@Startup
@TransactionManagement(TransactionManagementType.BEAN)
public class TimerSingleton {

    @Inject
    private UserTransaction ut;

    @PostConstruct
    public void execute() throws Exception {

        ut.begin();
        ut.setTransactionTimeout(3); // Transaction should timeout after 3 seconds

        System.out.println(">>> Executing...");
        Thread.sleep(5000); // Block for 5 seconds

        ut.commit();

        System.out.println(">>> Completed");
    }
}

方法完全执行:
17:00:12,138 INFO  [stdout] (ServerService Thread Pool -- 85) >>> Executing...

17:00:17,139 INFO  [stdout] (ServerService Thread Pool -- 85) >>> Completed

我正在使用 Wildfly 8.2 并且我知道 @TransactionTimeout 注释,但它是专有的,我想知道如何以可移植的方式控制它。

最佳答案

必须先调用setTransactionTimeout方法,然后再调用begin方法,这是因为setTransactionTimeout使用begin方法修改了与当前线程启动的事务关联的超时值。

关于java - UserTransaction.SetTransactionTimeout无法正常工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28096898/

10-13 09:20