代码之家  ›  专栏  ›  技术社区  ›  Kumar D

ApplicationException-Java-Hibernate-rollback相关

  •  2
  • Kumar D  · 技术社区  · 15 年前

    我的问题与交易和例外有关

    我有10条记录要插入到数据库表中。在插入每个记录之后,我将数据插入另一个表中。所以,如果插入第二个表失败,我想回滚该记录。

    前任。 比如说一次处理10个人的现金转账(从一个账户到另一个账户)。

    伪代码:

    for(int i = 0; i < TransferRecords.length; i++)
    {
        try
        {
              //Deduct cash from TransferRecord.accountFrom --- Includes use of Hibernate Session
              //Add cash in TransferRecord.accountTo -- Includes use of Hibernate Session
         } catch(AppException exception)
         {
                //Rollback the transaction only for this particular transfer (i)
                // But here when I go for next record it says session is closed
         }
    }
    

    ---------结束EJB方法

    这里AppException是使用@ApplicationException(rollback=true)注释创建的。

    但这里的问题是:当TransferRecord 2失败并且当我移动到TransferRecord 3时,会出现“会话关闭”错误。

    我的疑问是: 2.如何确保会话未关闭但事务已回滚(仅适用于特定失败事务的会话)

    先谢谢你。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Community CDub    7 年前

    TransferRecord 并在相同且唯一的事务中处理。

    RuntimeException 还是你打电话 setRollbackOnly() ? 我只是好奇。

    或者我应该在EJB之外运行for循环(对于每个TransferRecord)?

    为什么在外面?没有什么强迫你这么做。如果要处理每个 转让记录 在它自己的事务中,您应该将它们传递给 EJB方法(下面的代码受 this answer ):

    // supposing processRecords is defined on MyStatelessRemote1 and process defined on MyStatelessLocal1
    @Stateless
    @TransationAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public class MyStatelessBean1 implements MyStatelessLocal1, MyStatelessRemote1 {
        @EJB
        private MyStatelessLocal1 myBean;
    
        public void processRecords(List<TransferRecord> objs) {
            // No transactional stuff so no need for a transaction here
            for(Object obj : objs) {
                this.myBean.process(obj);
            }
        }
    
        @TransationAttribute(TransactionAttributeType.REQUIRES_NEW)
        public void process(TransferRecord transferRecord) {
            // Transactional stuff performed in its own transaction
            // ...
        }
    }
    

    如何确保会话未关闭,但事务已回滚(仅适用于特定失败事务的会话)

        2
  •  1
  •   scienty    15 年前

        3
  •  0
  •   ATorras    15 年前

    我认为您可以创建两个独立的事务,第一个用于TransferRecord(1)(在一切正常后执行提交),然后为所有TransferRecord(I+1)启动其他TX。

    另一种方法是使用保存点,能够回滚并丢弃超过该保存点的所有内容(但我更喜欢第一种方法)。

    当做