@Transaction (распространение = Propagation.REQUIRES_NEW) не отображается в хранимой процедуре MS SQL

Я столкнулся со следующим, и я хотел бы посмотреть, видел ли кто-нибудь это раньше или мог бы дать мне объяснение.

У меня есть хранимая процедура, которую нужно запустить в одной транзакции. В частности, хранимая процедура содержит следующие строки кода:

set @v_nested_transactions = @@trancount;

if @v_nested_transactions = 0
begin
  raiserror('Error: must be within a single transaction', 11, 1);
end
else if @v_nested_transactions >= 2
begin
  raiserror('Error: must not be used within nested transactions', 11, 1);
end;

Я использую Spring и mybatis для вызова хранимой процедуры. Я использую фасадный слой, который вызывает сервис -> репозиторий -> DAO. Звонки производятся следующим образом:

Слой фасада

@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void callProcedure(final long id) {
    callProcedureService.callProcedure(id);
}

Уровень обслуживания:

@Override
public void callProcedure(final long id) {
    CallProcedureRepository.callProcedure(id);
}

Репозиторий:

public void callProcedure(final long id) {
    callProcedureDao.callProcedure(id);
}

Слой DAO:

@Override
@Transactional(propagation = Propagation.MANDATORY)
public void callProcedure(final long id) {
    final Map<String, Object> parameters = new HashMap<>();
    parameters.put("id", id);
    this.sqlSession.update("callProcedure", parameters);
}

Хранимая процедура вызывается из карты SQL с помощью mybatis-spring. Класс, вызывающий обновление, - это SQLSessionTemplate.class. Карта sql выглядит так:

<update id = "callProcedure" statementType = "CALLABLE" parameterType = "map">
    {CALL package.callProcedure(
      #{id, mode=IN, jdbcType=NUMERIC})}
</update>

Наконец, я использую следующее в файле persistence-context.xml проекта Spring.

<tx:annotation-driven transaction-manager = "transactionManager" mode = "aspectj"/>

Хранимая процедура работает по назначению. Я проверил это, удалив проверку @@ trancount.

Моя проблема в том, что хранимая процедура всегда выдает ошибку «Ошибка: должно быть в рамках одной транзакции». После выполнения нескольких тестов кажется, что spring правильно создает новую транзакцию для хранимой процедуры, и если что-то пойдет не так, транзакция откатится Однако транзакция не отображается в диспетчере транзакций на сервере MS SQL; это означает, что @@ trancount всегда возвращает 0.

Кто-нибудь сталкивался с этой проблемой раньше? Есть ли обходной путь, который я мог бы использовать?

Спасибо

Как называется метод callProcedure? Как выглядит ваша услуга? Покажи свою конфигурацию ...

M. Deinum 13.09.2018 21:41

Я обновил сообщение, добавив больше информации. Как видите, я не делаю ничего особенного в своем коде. Это довольно простой вызов хранимой процедуры. Если вам потребуется дополнительная информация, дайте мне знать.

Tasos G. 14.09.2018 14:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
328
0

Другие вопросы по теме