我遇到了以下情况,我想看看是否有人以前见过此事,或者可以为我提供解释。
我有一个存储过程,它需要在单个事务中运行。特别是,存储过程包含以下代码行:
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);
}
使用mybatis-spring从SQL映射中调用存储过程。调用更新的类是SQLSessionTemplate.class。 sql映射如下所示:
<update id="callProcedure" statementType="CALLABLE" parameterType="map">
{CALL package.callProcedure(
#{id, mode=IN, jdbcType=NUMERIC})}
</update>
最后,我在Spring项目的persistence-context.xml中使用以下内容。
<tx:annotation-driven transaction-manager="transactionManager" mode="aspectj"/>
存储过程按预期工作。我已经通过删除@@ trancount检查进行了测试。
我的问题是存储过程总是抛出错误“错误:必须在单个事务中”。运行了几次测试后,似乎spring正确为存储过程创建了一个新事务,如果出了问题,事务回滚没有问题,但是,该事务在MS SQL Server的事务管理器中似乎不可见;这意味着@@ trancount始终返回0。
任何人以前都遇到过此问题吗?有可以使用的解决方法吗?
谢谢