Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaEE-在事务之间共享资源_Java_Jakarta Ee_Transactions_Java Ee 6 - Fatal编程技术网

JavaEE-在事务之间共享资源

JavaEE-在事务之间共享资源,java,jakarta-ee,transactions,java-ee-6,Java,Jakarta Ee,Transactions,Java Ee 6,我正在开发一个应用程序,它启动一个事务,注册一些资源,启动另一个事务,并基于前一个事务注册的资源执行处理。例如: 登记册: @Stateless @LocalBean public class Register { @Resource TransactionSynchronizationRegistry tsr; public void registerResource(String id, Resource r) { tsr.putResource(id, r)

我正在开发一个应用程序,它启动一个事务,注册一些资源,启动另一个事务,并基于前一个事务注册的资源执行处理。例如:

登记册:

@Stateless
@LocalBean
public class Register {
    @Resource TransactionSynchronizationRegistry tsr;
    public void registerResource(String id, Resource r) {
        tsr.putResource(id, r);
    }
}
第一笔交易

@Stateless
@LocalBean
public class FirstTransaction {
    @Inject Register r;
    @Inject SecondTransaction st;

    public void doRegistering(Resource r) {
        r.registerResource("key", r);
        st.doProcess();
        // do other operations...
    }
}
@Stateless
@LocalBean
public class SecondTransaction {
    @Resource TransactionSynchronizationRegistry tsr;

    /*
     * start new transaction in order to ensure that
     * there won't be any rollback on any operations
     * performed by this method if its caller fails
     */
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void doProcess() {
        Resource r = (Resource) tsr.getResource("key");
        // start processing resource...
    }
}
第二笔交易

@Stateless
@LocalBean
public class FirstTransaction {
    @Inject Register r;
    @Inject SecondTransaction st;

    public void doRegistering(Resource r) {
        r.registerResource("key", r);
        st.doProcess();
        // do other operations...
    }
}
@Stateless
@LocalBean
public class SecondTransaction {
    @Resource TransactionSynchronizationRegistry tsr;

    /*
     * start new transaction in order to ensure that
     * there won't be any rollback on any operations
     * performed by this method if its caller fails
     */
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void doProcess() {
        Resource r = (Resource) tsr.getResource("key");
        // start processing resource...
    }
}
但是,由于新事务是在注册资源后创建的,因此我无法再次访问相同的TransactionSynchronizationRegistry。我知道TransactionSynchronizationRegistry只用于一个事务,所以问题是是否有其他方法,例如resource registry,我可以在不同的事务中使用

谢谢


L

这是相当大的开销,但您可以让他们从JMS消息队列生成/使用有效负载。

如果Tx1挂起并且Tx2正在运行,您确定能够查看与Tx1相关的资源吗?我认为JTA/JavaEE不支持嵌套事务。第一个事务不会挂起,因为它在调用第二个事务后会执行其他操作,我会更新问题以反映它。谢谢。你说的不是意味着第一次发射暂停了吗?Tx1启动(默认:必需),将资源与其关联;Tx2启动(需要新)-此时Tx1暂停,直到Tx2完成。Tx1可见的资源仅对Tx1可见。Tx2结束,Tx1恢复。抱歉,我在“暂停”和“终止”之间弄错了。您是对的,第一个事务被挂起,第二个事务无法从中查看资源。我正在寻找另一种解决方案,这样第一个事务中的资源可以共享到第二个事务中。好的,我们同意了这个方案。我认为这就是所谓的嵌套事务。实现JTA的JavaEE事务管理器不支持这些。很遗憾,我不知道您的问题有什么解决方法。您好,您的意思是第一个事务应该向第二个事务发送一条包含资源的消息吗?我真的不想这样做,因为第二个事务可以在其他地方重用,所以我希望它尽可能像普通方法调用一样通用。