我实现了一个ejb3无状态会话bean,用于将一组收件人导入数据库。我在公共方法中使用@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)提交了每个收件人记录
@Stateless
@Local(ImportRecipientManagerLocal.class)
@SecurityDomain("recipient")
public class ImportRecipientManagerSLB implements ImportRecipientManagerLocal {
@EJB
private ImportRecipientManagerLocal anotherRecipientManager;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
@TransactionTimeout(30 * 60)
@Override
public RecipientImportStatus saveRecipient(Recipient recipient) throws
ImportRecipientFailedException {
// saves the reicpient
}
public RecipientsImportStatus createRecipients(List<Recipient> recipientList) {
// while recipient exist in list
anotherRecipientManager.saveRecipient(recipient);
// end while
}
问题是当客户同时提交了2个相同的文件(内容相同)时,它创建了重复的收件人。我认为这是因为两个会话bean处理器是并行执行的。但困扰我的是,自saveRecipient结束后,事务被提交,数据应该对其他事务可见。不是吗?
我无法理解它是如何发生的,感谢有人可以帮我解决这个问题。
答案 0 :(得分:0)
正如你所说的,如果事务同时并行运行,它创建了重复的收件人,但是如果我们使用FlushMode.COMMIT,则意味着它在提交之前总是与数据库同步,这就是第二个进程记录插入失败并出现约束违规的原因。所以总是建议在提交之前进行刷新。