sqlserver 事务报错 com.microsoft.sqlserver.jdbc.SQLServerException: 服务器无法继续执行该事务
com.microsoft.sqlserver.jdbc.SQLServerException: 服务器无法继续执行该事务
问题相关代码
用的baomidou.dynamic.datasource 管理数据源。
所以这里的事务注解用的是 @DSTransactional,与单数据源下的 spring的 @Transactional一样。
我这里操作的是同一个数据源,没有跨数据源操作。
以下代码在 windows上面正常运行,在linux上报错
1,2,3,4,步的log正常打印。第5步中,是在请求一个接口,分页同步数据,批量insert 到sqlserver,insert时候抛出下文中的异常。
代码:
@Override
@DSTransactional
@XxlJob("GoodsMasterData")
public void syncData() {
LocalDateTime start = LocalDateTime.now();
// 1.删掉backup表,
dataOptMapper.dropIfExists(GOODS_MASTER_DATA_BACKUP);
log.info("drop table :{}", GOODS_MASTER_DATA_BACKUP);
// 2.查询建表语句
String createSql = dataOptMapper.selectSqlserverCreateTableSql(GOODS_MASTER_DATA);
// 3.goods_master_data表rename为goods_master_data_backup
dataOptMapper.renameTable(GOODS_MASTER_DATA, GOODS_MASTER_DATA_BACKUP);
log.info("rename table :{}, {}", GOODS_MASTER_DATA, GOODS_MASTER_DATA_BACKUP);
// 4.创建新的goods_master_data表
dataOptMapper.createTable(createSql);
log.info("create table :{}", GOODS_MASTER_DATA);
// 5.开始同步数据
int syncTotalCount = this.forSync();
syncDataLogService.insertSyncDataLog(start, LocalDateTime.now(), 1, syncTotalCount, StringUtils.EMPTY, GOODS_MASTER_DATA);
}
druid 线程池配置
spring.datasource.dynamic.datasource.proddb.druid.initialSize=5
spring.datasource.dynamic.datasource.proddb.druid.minIdle=5
spring.datasource.dynamic.datasource.proddb.druid.maxActive=20
spring.datasource.dynamic.datasource.proddb.druid.maxWait=60000
spring.datasource.dynamic.datasource.proddb.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.dynamic.datasource.proddb.druid.minEvictableIdleTimeMillis=300000
spring.datasource.dynamic.datasource.proddb.druid.validationQuery=SELECT 1
spring.datasource.dynamic.datasource.proddb.druid.testWhileIdle=true
spring.datasource.dynamic.datasource.proddb.druid.testOnBorrow=false
spring.datasource.dynamic.datasource.proddb.druid.testOnReturn=false
spring.datasource.dynamic.datasource.proddb.druid.poolPreparedStatements=true
spring.datasource.dynamic.datasource.proddb.druid.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.dynamic.datasource.proddb.druid.connection-properties=druid.stat.mergeSql=true;ruid.stat.slowSqlMillis=5000
spring.datasource.dynamic.datasource.proddb.druid.useGlobalDataSourceStat=true
spring.jpa.hibernate.ddl-auto=none
运行结果及报错内容
java.lang.reflect.InvocationTargetException at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at com.xxl.job.core.handler.impl.MethodJobHandler.execute(MethodJobHandler.java:31) at com.xxl.job.core.thread.JobThread.run(JobThread.java:163)
Caused by: org.springframework.jdbc.UncategorizedSQLException:
### Error updating database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 服务器无法继续执行该事务。
说明: 7100000001。
### The error may involve defaultParameterMap
### The error occurred while setting parameters ### SQL: INSERT INTO goods_master_data (
我的解答思路和尝试过的方法
本地环境 java11,windows11 正常运行
线上环境 java11,ubuntu22,抛出异常,去掉事务注解@DSTransactional 正常运行。
本地环境与线上环境请求的数据一样。
我想要达到的结果
网上资源很少,想知道是什么问题。