gpt4 book ai didi

java - 什么时候应该调用 Transaction.delistResource()?

转载 作者:行者123 更新时间:2023-11-30 11:51:55 26 4
gpt4 key购买 nike

我们将内存中的 LRU 缓存用于我们应用程序中的多个不同模型。为避免回滚事务(如过时的条目)引起的问题,添加了事务缓存的概念:为每个事务创建一个临时缓存,然后如果回滚或将条目复制到主缓存,则条目将被丢弃如果已提交,则缓存该模型。

为此,缓存实现了 XAResource 并覆盖了 commit()rollback() 方法。每当新的 Transaction 想要访问一些不在主缓存中的数据时,就会创建事务缓存并将其传递到 enlistResource()

问题是我试图在 commit()rollback() 方法中对缓存实例调用 delistResource() ,它抛出一个 IllegalStateException,表示该事务已被标记为回滚(或提交)。所以我想知道...是否可以将缓存作为资源从列表中删除(换句话说,它已经作为回滚或提交过程的一部分被删除),或者是否还有另一点应该在哪里调用它的流程?

最佳答案

调用 delistResource 的不是 XAResource 的方法,而是应用服务器的 Transaction 实现。如果您希望某个资源下架,请获取交易并对其调用 delist,它将根据需要为您调用资源上的 end()。事务管理器同样隐式调用 end() 作为终止处理的一部分,因此您不必在提交或回滚时手动执行此操作。您需要处理除名的唯一情况是在多个事务上下文中使用相同的资源实例。例如

    Cache c = getCache();    c.makeUpdate(); // no transaction running, should auto commit.    tx.begin(); // start tx A    c.makeUpdate(); // transactional within A    tx.suspend();    tx.begin(); // start tx B    c.makeUpdate(); // transactional within B    tx.commit(); //end B    tx.resume(A);    tx.commit(); // end A

根据您的缓存实现,您可能需要在挂起时取消列表并在恢复时再次登记,但不是为了提交或回滚。或者,您在每次调用 makeUpdate() 时检查事务上下文,而不是依赖登记/取消列表调用的顺序来更新资源实例持有的有效 tx 上下文。

由于过程 XA 规范和或多或少的面向对象的 JTA 规范之间的映射不佳,所以这东西很难。坦率地说,你最好把它留给专家。例如,JBoss Infinispan 提供了一个开源事务缓存,可以为您处理所有这一切,并提供许多其他功能。

关于java - 什么时候应该调用 Transaction.delistResource()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7168605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com