分布式事务已完成。请将此会话登记到新事务或 NULL 事务中。

问题描述

程序在修改同一个数据表中多个数据时报错,事务自动回滚没有修改任何数据,具体报错信息如下,求问这个问题的出现原因以及解决方案。

问题补充

  1. 使用相同的数据重新执行发现每次只操作一条数据时正常运行,同时操作多条数据时出现异常。

错误日志

### Error updating database.  Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 分布式事务已完成。请将此会话登记到新事务或 NULL 事务中。
### The error may involve com.nim.finance.mapper.GoldenTaxInvoiceMapper.updateByPrimaryKeySelective-Inline
### The error occurred while setting parameters
### SQL: update **** SET ** = ?,** = ? where gti_id = ?
### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 分布式事务已完成。请将此会话登记到新事务或 NULL 事务中。
; uncategorized SQLException for SQL []; SQL state [S0001]; error code [8525]; 分布式事务已完成。请将此会话登记到新事务或 NULL 事务中。; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 分布式事务已完成。请将此会话登记到新事务或 NULL 事务中。] with root cause

com.microsoft.sqlserver.jdbc.SQLServerException: 分布式事务已完成。请将此会话登记到新事务或 NULL 事务中。
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:258) ~[mssql-jdbc-6.2.2.jre8.jar!/:na]
………………

环境

springBoot,sqlServer

阅读 4.7k
3 个回答

问题已经解决了。
原因是这样的,此问题相关有两个方法,【方法A】接收并批量处理多组数据,【方法B】接受【方法A】的调用接收单组数据,每次只吃会同时操作多个数据表。
要求当其中某组数据出现异常时后续的多组数据要正常处理,例如当程序批量处理5组数据,其中第2,4组出现异常第1,3,5组的数据应该正常保存。
所以我对【方法B】添加@Transactional(propagation=Propagation.REQUIRES_NEW)注解使用单独的事务处理,并且【方法A】上也有相同的注解,最终导致在程序在处理多组数据时出现事务异常。
解决方案,把【方法A】的注解改为@Transactional使用已有的事务,【方法B】不做任何调整。

### The error may involve com.nim.finance.mapper.GoldenTaxInvoiceMapper.updateByPrimaryKeySelective-Inline
### The error occurred while setting parameters
### SQL: update **** SET ** = ?,** = ? where gti_id = ?

不是提示了,设置参数出问题了么

没用过 SQL Server,根据错误信息可以得知,是这个数据库操作没有被安排到事务当中。根据你的描述,如果只操作一条数据就没事,操作第二条数据就失败,可见最大的可能是,第一条数据操作完毕后,事务就提交了。至于为什么会这样,建议楼主再去研读下代码。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题