在下面的代码片段中,我试图保留两个实体——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();
问题:
- 我怎样才能避免死锁?为什么这里会发生死锁?毕竟,从逻辑上讲, AccountDetails不需要对Account进行锁定来持久化。