假设我在桌子上有这些数据' X' :
ID UpdatedDate ParentID
001 2015-01-01 1
002 1
003 1
代码是(我简化了代码):
...
@Autowired
private XDao xDao;
private void createTransaction(ParentData parentData) {
List<XData> xDataList = xDao.getDataByParentIdAndUpdatedDateIsNull(parentData.getId());
XData xData = null;
// Then we get only the first row of the list
if(xDataList != null && xDataList.size() > 0) {
xData = xDataList.get(0);
} else {
return;
}
// Another transaction
...
// Then we update the UpdatedDate
xData.setUpdatedDate(new Date());
xDao.saveAndFlush(xData);
// And we call the createTransaction again until there is no more xData with a null UpdatedDate on a Parent ID
createTransaction(parentData);
}
但我得到的是一个永无止境的过程,当我检查数据库时,它总是在同一个父ID上互相折磨数据。 db就像这样:
第一次迭代:
ID UpdatedDate ParentID
001 2015-01-01 1
002 2015-02-02 1
003 1
第二名:
ID UpdatedDate ParentID
001 2015-01-01 1
002 1
003 2015-02-02 1
第三名:
ID UpdatedDate ParentID
001 2015-01-01 1
002 2015-02-02 1
003 1
等。怎么了?
这是getDataByParentIdAndUpdatedDateIsNull类(我简化了代码):
...
public static final String GET_DATA_BY_PARENTIDANDUPDATEDDATEISNULL =
"SELECT o FROM XData o " +
"WHERE o.parentData.parentId = ?1 " +
" AND o.updatedDate IS NULL";
@Query(GET_DATA_BY_PARENTIDANDUPDATEDDATEISNULL)
public List<XData> getDataByParentIdAndUpdatedDateIsNull(Long parentId);
答案 0 :(得分:0)
你能分享吗,
1)XDao
2)您的基础数据存储是什么
3)您使用的是任何ORM框架
吗? 4)您在存储库/服务或@Transactional
上使用显式tx:annotation-driven
吗?
基于上述组合的行为会有所不同,但我的猜测是服务事务边界与存储的混淆或者因为@Transactional
机制基于代理,只有'外部'方法通过代理进入的呼叫将被拦截,您的递归呼叫将不会通过您为createTransaction
方法设置的相同AOP。
话虽如此,是不是可以做这样的事情而不是递归:
for (XData xData : xDataList) {
xData.setUpdatedDate(new Date());
xData.saveAndFlush(xData);
}