在下面的代码片段中,我尝试坚持两个实体 - Account和AccountDetails。我希望这是原子。意义上来说,Account和AccountDetails实体都应该保持在单个事务中。我无法实现它。在单个事务中在多个表中保留数据
请注意AccountDetails表引用帐户表与外键(account.id)。
如果我试着让它们在同一个事务中,我会陷入僵局。否则,我需要两次不同会话的不同交易。
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();
问题:
- 我怎样才能避免僵局?为什么在这里发生死锁?毕竟,逻辑上,帐户详细信息不需要锁定帐户将被保留。
虽然我有一个解决会话和事务由个别数据访问对象照顾的地方,但我无法实现我所寻找的原子性。 – 2012-04-05 08:47:06
实际上,您不能为一个以上的进程使用一个会话。该策略是一个过程的一个会话。您可以使用JPA实现,我的意思是entitymanagerfactory和entitymanager。你可以使用entitymanager进行很多过程。但我认为会议是不可能的。 – mbaydar 2012-04-05 19:29:53
为功能表及其详细信息表创建事务处理没有意义。我永远不想分开这两个操作。如果我想在单个事务中对多个表进行更改,该怎么办?任何方式来做到这一点? – 2012-04-05 23:42:28