Spring @transactional не работает в хранилище - PullRequest
0 голосов

У меня есть простой репозиторий, который помечен @Transactional. И для реализации ORM я использую SQL2O.

У меня очень специфические запросы, в одном методе я делаю в trasaction 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 голосов

Я решил свою проблему с замком:

  some method(){
    locker.lock()
    try (Connection connection = sql2o.beginTransaction()) {
            do some execute..
            connection.commit()
        } finaly{ locker.unlock()}
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...