以下のコード スニペットでは、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();
質問:
- どうすればデッドロックを回避できますか? ここでデッドロックが発生するのはなぜですか?結局、論理的には、 AccountDetailsはAccountを永続化するためにロックする必要はありません。