0

在下面的代码片段中,我试图保留两个实体——Account 和 AccountDetails。我希望这是原子的。这意味着,Account 和 AccountDetails 实体都应该保存在一个事务中。我无法实现它。

请注意,AccountDetails 表是指具有外键 (account.id) 的 Account 表。

如果我尝试将它们保持在同一个事务中,我会遇到死锁。否则,我需要两个具有不同会话的不同事务。

        Account instance = (Account) transientInstance;
        Set<AccountDetails> accountDetailses = instance.getAccountDetailses();
        AccountsHomeFactory factory = AccountsHomeFactory.getInstance();
        AccountDetailsHome accountDetailsDAO = (AccountDetailsHome) factory.getDAO("AccountDetails");

        transaction.begin();
        sessionFactory.getCurrentSession().persist(instance);

        transaction.commit();
                    // get new session ands start the transaction.
        transaction.begin();

        for (AccountDetails accountDetails : accountDetailses) {
            accountDetailsDAO.persist(accountDetails);
            log.debug("persist successful");
        }

        log.debug("transaction commit");
        transaction.commit();

问题:

  1. 我怎样才能避免死锁?为什么这里会发生死锁?毕竟,从逻辑上讲, AccountDetails不需要对Account进行锁定来持久化。
4

1 回答 1

0

我认为你想做的事情是可能的。解决方案是一个会话的多个事务。您可以阅读内容,希望对您有所帮助。

于 2012-04-06T05:13:44.287 回答