在新的持久化之后,先前的持久数据总是重叠

时间:2015-06-09 00:48:20

标签: java jpa spring-data-jpa overlap transactional

假设我在桌子上有这些数据' 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);

1 个答案:

答案 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);
}