@Transaction (распространение = Propagation.REQUIRES_NEW) не отображается в хранимой процедуре MS SQL - PullRequest
0 голосов
/ 13 сентября 2018

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

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

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.

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

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

Спасибо

...