Spring @transactional在存储库中不起作用

时间:2019-06-05 15:55:31

标签: spring-boot transactions

我有一个简单的存储库,该存储库以@Transactional注释。对于ORM实施,我正在使用SQL2O。

我有非常具体的查询,在通过DELETE查询全部取回数据之后,我先执行事务UPDATE然后执行commit()然后执行SELECT的一种方法。因此,问题在于在某些情况下它将返回错误的结果值。我的意思是,最后插入的数据不在结果值中,因为尚未提交。

存储库类中的方法示例:

@Transactional
@Repository
@Slf4j
public class WishListRepositoryImpl implements WishListRepository {

    @Autowired
    private Sql2o sql2o;

    @Override
    public LinkedHashSet<String> deleteThenUpdateAndReturnFavorites(final String delete, final String update,
                                                                    final String crmId) {
        try (Connection connection = sql2o.beginTransaction()) {
            connection.createQuery(DELETE_FAVORITES_QUERY)
                    .addParameter(MATERIALS_JSON, delete)
                    .addParameter(CRM_ID, crmId)
                    .executeUpdate();
            connection.createQuery(ADD_NEW_FAVORITES_QUERY)
                    .addParameter(MATERIALS_JSON, update)
                    .addParameter(CRM_ID, crmId)
                    .executeUpdate();
            connection.commit();
            return new LinkedHashSet<>(connection.createQuery(FIND_ALL_CLIENT_FAVORITES_QUERY)
                    .addParameter(CRM_ID, crmId)
                    .executeAndFetch(String.class));
        }
    }

我需要结果值应该是在一次交易中成功commit()之后。

1 个答案:

答案 0 :(得分:0)

我已经解决了Lock的问题:

  some method(){
    locker.lock()
    try (Connection connection = sql2o.beginTransaction()) {
            do some execute..
            connection.commit()
        } finaly{ locker.unlock()}
    }