我有一个Spring / JPA / Hibernate应用程序,并且有一段代码由石英作业每分钟调用一次,以发送一些通知。
@Transactional
public void sendNotifications(){
Set<MyEntity> entitySet = getDAO().findEntitiesToNotify();
for (MyEntity e : entitySet) {
sendEntityNotificationEmail(e);
e.setNotification(true);
this.merge(e);
}
return false;
}
大部分时间都可以正常使用。关键短语是“大部分时间”,因为有时,此事务不会更新数据库,因此通知电子邮件每分钟发送一次,直到我手动去杀死石英作业或更新数据库。日志中没有错误,数据库也没有更新。有谁知道这个问题是什么?或者我可以通过任何方式调试此问题。是否存在一些竞争条件,因为此方法每隔一分钟被调用一次,因此新线程再次调用同一任务而另一个正在处理它,因此更改不会持久存在?
答案 0 :(得分:0)
最好在其他线程中发送通知,而不是再次从数据库获取实体,更新实体状态并保存