分布式事务已完成。请将此会话登记到新事务或 NULL 事务中。
问题描述
程序在修改同一个数据表中多个数据时报错,事务自动回滚没有修改任何数据,具体报错信息如下,求问这个问题的出现原因以及解决方案。
问题补充
- 使用相同的数据重新执行发现每次只操作一条数据时正常运行,同时操作多条数据时出现异常。
错误日志
### 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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
问题已经解决了。
原因是这样的,此问题相关有两个方法,【方法A】接收并批量处理多组数据,【方法B】接受【方法A】的调用接收单组数据,每次只吃会同时操作多个数据表。
要求当其中某组数据出现异常时后续的多组数据要正常处理,例如当程序批量处理5组数据,其中第2,4组出现异常第1,3,5组的数据应该正常保存。
所以我对【方法B】添加@Transactional(propagation=Propagation.REQUIRES_NEW)注解使用单独的事务处理,并且【方法A】上也有相同的注解,最终导致在程序在处理多组数据时出现事务异常。
解决方案,把【方法A】的注解改为@Transactional使用已有的事务,【方法B】不做任何调整。
不是提示了,设置参数出问题了么
没用过 SQL Server,根据错误信息可以得知,是这个数据库操作没有被安排到事务当中。根据你的描述,如果只操作一条数据就没事,操作第二条数据就失败,可见最大的可能是,第一条数据操作完毕后,事务就提交了。至于为什么会这样,建议楼主再去研读下代码。