@Transaction(propagation = Propagation.REQUIRES_NEW)在MS SQL存储过程中不可见

时间:2018-09-13 17:05:04

标签: sql-server spring mybatis spring-transactions

我遇到了以下情况,我想看看是否有人以前见过此事,或者可以为我提供解释。

我有一个存储过程,它需要在单个事务中运行。特别是,存储过程包含以下代码行:

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。

任何人以前都遇到过此问题吗?有可以使用的解决方法吗?

谢谢

0 个答案:

没有答案