0

以下のコード スニペットでは、Account と AccountDetails の 2 つのエンティティを保持しようとしています。これをアトミックにしたい。つまり、Account エンティティと AccountDetails エンティティの両方を 1 つのトランザクションで永続化する必要があります。私はそれを達成することができません。

AccountDetails テーブルは、外部キー (account.id) を使用して Account テーブルを参照することに注意してください。

それらを同じトランザクションに保持しようとすると、デッドロックが発生します。そうでなければ、異なるセッションを持つ 2 つの異なるトランザクションが必要です。

        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

あなたがやりたいことは可能なことだと思います。解決策は、1 つのセッションに対して複数のトランザクションを実行することです。あなたはこれを読むことができます。

于 2012-04-06T05:13:44.287 に答える