Я столкнулся со следующим и хотел бы узнать, видел ли кто-нибудь это раньше или мог бы дать мне объяснение.
У меня есть хранимая процедура, которую необходимо запустить в одной транзакции.В частности, хранимая процедура содержит следующие строки кода:
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.
Кто-нибудь сталкивался с этой проблемой раньше? Есть ли обходной путь, который я мог бы использовать?
Спасибо