问题描述
程序在修改同一个数据表中多个数据时报错,事务自动回滚没有修改任何数据,具体报错信息如下,求问这个问题的出现原因以及解决方案。
问题补充
- 使用相同的数据重新执行发现每次只操作一条数据时正常运行,同时操作多条数据时出现异常。
错误日志
### 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
问题已经解决了。
原因是这样的,此问题相关有两个方法,【方法A】接收并批量处理多组数据,【方法B】接受【方法A】的调用接收单组数据,每次只吃会同时操作多个数据表。
要求当其中某组数据出现异常时后续的多组数据要正常处理,例如当程序批量处理5组数据,其中第2,4组出现异常第1,3,5组的数据应该正常保存。
所以我对【方法B】添加@Transactional(propagation=Propagation.REQUIRES_NEW)注解使用单独的事务处理,并且【方法A】上也有相同的注解,最终导致在程序在处理多组数据时出现事务异常。
解决方案,把【方法A】的注解改为@Transactional使用已有的事务,【方法B】不做任何调整。