如何让Log shipping成功的备份信息不出现在SQL Server error log

本文介绍了如何通过启用TraceFlag3226来避免SQLServer错误日志中频繁备份操作的冗余信息,显著减少错误日志大小,提升日志管理效率。

配置了SQL Server 日志传送后,因为备份的数据库比较多而且时间频繁所以造成SQL Server日志非常大。如下图:

 

 

 

由于我们已经有了Log shipping的监控,所以这些备份信息对于我们来说基本上没什么用处。 那有没有办法使这些信息部出现在数据库错误日志中呢? 答案是 Trace Flag3226

 

下面内容来自MSDN:

 

3226

By default, every successful backup operation adds an entry in the SQL Server error log and in the system event log. If you create very frequent log backups, these success messages accumulate quickly, resulting in huge error logs in which finding other messages is problematic.

With this trace flag, you can suppress these log entries. This is useful if you are running frequent log backups and if none of your scripts depend on those entries.

 

在我的数据库服务器上启用Trace flag3226,错误日志中成功的备份信息不再显示:

 

dbcc traceon(3226,-1)

go

 

backup database DBAtodisk='d:\mssql\dba.bak'---执行三次完整备份

go 3

 

backup log  DBAtodisk='d:\mssql\dba_log.trn'--执行四次日志备份

go 4

 

sp_readerrorlog  --查看SQL Server错误日志

 

 

也可以在启动参数中添加:

-T 3226

 

如果只想影响当前的会话使用下面的命令:

 

DBCC TRACEON(3226) 

 

 

/** * 取消发布 */ @Override @Transactional(rollbackFor = Exception.class) public Mono<Result<String>> updateCancelReleaseStatus(Integer id) { return Mono.fromCallable(() -> { // 查询ASN信息 - 在事务内执行 AsnMainPO asnMain = asnMainMapper.selectOne( new LambdaQueryWrapper<AsnMainPO>() .eq(AsnMainPO::getId, id) ); if (asnMain == null) { throw new BusinessException(ResultCode.ASN_NOT_FOUND); } if (!AsnStatusEnum.RELEASED.getCode().equals(asnMain.getStatus())) { throw new BusinessException(ResultCode.ASN_STATUS_NOT_RELEASED); } List<AsnDetailPO> asnDetails = asnDetailMapper.selectList( new LambdaQueryWrapper<AsnDetailPO>() .eq(AsnDetailPO::getAsnNo, asnMain.getAsnNo()) ); if (asnDetails.isEmpty()) { throw new BusinessException(ResultCode.ASN_DETAIL_EMPTY); } return Tuples.of(asnMain, asnDetails); }) .flatMap(tuple -> { AsnMainPO asnMain = tuple.getT1(); List<AsnDetailPO> asnDetails = tuple.getT2(); // 1. 调用SAP接口取消ASN return callSapInterfaceReactive(asnMain.getAsnNo(), "CANCEL", asnDetails) // 2. 回滚订单可发货数量 .then(rollbackOrderAvailableQuantityReactive(asnMain, asnDetails)) // 3. 更新ASN状态 .then(Mono.fromRunnable(() -> { asnMain.setStatus(AsnStatusEnum.PENDING_RELEASE.getCode()); asnMain.setReleaseDate(null); asnMainMapper.updateReleaseStatus(id, asnMain.getStatus(), asnMain.getReleaseDate()); })) .thenReturn(Result.success("取消发布成功")) .onErrorResume(e -> { log.error("取消发布ASN失败,ID: {}", id, e); // 事务会自动回滚 return Mono.just(Result.fail("取消发布失败:" + e.getMessage())); }); }); } 2025-10-16 10:46:01.570 [reactor-http-nio-4] DEBUG reactor.netty.http.server.HttpServerOperations - [a18754e0, L:/192.168.10.130:9002 - R:/192.168.10.130:20167] New http connection, requesting read 2025-10-16 10:46:01.570 [reactor-http-nio-4] DEBUG reactor.netty.transport.TransportConfig - [a18754e0, L:/192.168.10.130:9002 - R:/192.168.10.130:20167] Initialized pipeline DefaultChannelPipeline{(reactor.left.httpCodec = io.netty.handler.codec.http.HttpServerCodec), (reactor.left.httpTrafficHandler = reactor.netty.http.server.HttpTrafficHandler), (reactor.right.reactiveBridge = reactor.netty.channel.ChannelOperationsHandler)} 2025-10-16 10:46:01.575 [reactor-http-nio-4] DEBUG reactor.netty.http.server.HttpServerOperations - [a18754e0, L:/192.168.10.130:9002 - R:/192.168.10.130:20167] Increasing pending responses, now 1 2025-10-16 10:46:01.577 [reactor-http-nio-4] DEBUG reactor.netty.http.server.HttpServer - [a18754e0-1, L:/192.168.10.130:9002 - R:/192.168.10.130:20167] Handler is being applied: org.springframework.http.server.reactive.ReactorHttpHandlerAdapter@3ed9a6e0 2025-10-16 10:46:01.577 [reactor-http-nio-4] DEBUG o.s.web.server.adapter.HttpWebHandlerAdapter - [a18754e0-3] HTTP POST "/asn/main/update/cancel/release/status/1" 2025-10-16 10:46:01.577 [reactor-http-nio-4] DEBUG o.s.w.r.r.m.a.RequestMappingHandlerMapping - [a18754e0-3] Mapped to com.hvlink.controller.AsnMainController#updateCancelReleaseStatus(Integer) 2025-10-16 10:46:01.690 [reactor-http-nio-4] DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name [com.hvlink.service.impl.AsnMainServiceImpl.updateCancelReleaseStatus]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-java.lang.Exception 2025-10-16 10:46:01.759 [reactor-http-nio-4] DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Acquired Connection [ConnectionID:3 ClientConnectionId: e4166486-d36e-4f93-be43-48e3d35d25c0] for JDBC transaction 2025-10-16 10:46:01.778 [reactor-http-nio-4] DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Switching JDBC Connection [ConnectionID:3 ClientConnectionId: e4166486-d36e-4f93-be43-48e3d35d25c0] to manual commit 2025-10-16 10:46:01.807 [reactor-http-nio-4] DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Initiating transaction commit 2025-10-16 10:46:01.807 [reactor-http-nio-4] DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Committing JDBC transaction on Connection [ConnectionID:3 ClientConnectionId: e4166486-d36e-4f93-be43-48e3d35d25c0] 2025-10-16 10:46:01.824 [reactor-http-nio-4] DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Releasing JDBC Connection [ConnectionID:3 ClientConnectionId: e4166486-d36e-4f93-be43-48e3d35d25c0] after transaction 2025-10-16 10:46:01.824 [reactor-http-nio-4] DEBUG o.s.w.r.r.m.annotation.ResponseBodyResultHandler - [a18754e0-3] Using 'application/json' given [*/*] and supported [application/json, application/*+json, application/x-ndjson, text/event-stream] 2025-10-16 10:46:01.824 [reactor-http-nio-4] DEBUG o.s.w.r.r.m.annotation.ResponseBodyResultHandler - [a18754e0-3] 0..1 [com.hvlink.common.Result<java.lang.String>] 2025-10-16 10:46:01.939 [reactor-http-nio-4] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession 2025-10-16 10:46:01.939 [reactor-http-nio-4] DEBUG org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7991312e] was not registered for synchronization because synchronization is not active 2025-10-16 10:46:01.978 [reactor-http-nio-4] DEBUG o.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource 2025-10-16 10:46:01.978 [reactor-http-nio-4] DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [ConnectionID:3 ClientConnectionId: e4166486-d36e-4f93-be43-48e3d35d25c0] will not be managed by Spring 2025-10-16 10:46:01.978 [reactor-http-nio-4] DEBUG com.hvlink.mapper.asn.AsnMainMapper.selectList - ==> Preparing: SELECT id,company_code,factory_code,warehouse_code,shipper_id,asn_no,status,production_batch,shipping_date,estimated_arrival_date,estimated_consumption_time,is_first_product,is_fully_shipping,release_date,version_no,approval_code,type,order_no,supplier_code,is_deleted,create_by,create_time,update_by,update_time FROM tb_asn_main WHERE (id = ?) 2025-10-16 10:46:02.024 [reactor-http-nio-4] DEBUG com.hvlink.mapper.asn.AsnMainMapper.selectList - ==> Parameters: 1(Integer) 2025-10-16 10:46:02.091 [reactor-http-nio-4] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7991312e] 2025-10-16 10:46:02.378 [reactor-http-nio-4] DEBUG o.s.beans.factory.xml.XmlBeanDefinitionReader - Loaded 11 bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml] 2025-10-16 10:46:02.380 [reactor-http-nio-4] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'DB2' 2025-10-16 10:46:02.391 [reactor-http-nio-4] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'Derby' 2025-10-16 10:46:02.391 [reactor-http-nio-4] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'H2' 2025-10-16 10:46:02.391 [reactor-http-nio-4] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'HDB' 2025-10-16 10:46:02.391 [reactor-http-nio-4] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'HSQL' 2025-10-16 10:46:02.391 [reactor-http-nio-4] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'Informix' 2025-10-16 10:46:02.391 [reactor-http-nio-4] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'MS-SQL' 2025-10-16 10:46:02.391 [reactor-http-nio-4] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'MySQL' 2025-10-16 10:46:02.391 [reactor-http-nio-4] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'Oracle' 2025-10-16 10:46:02.391 [reactor-http-nio-4] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'PostgreSQL' 2025-10-16 10:46:02.391 [reactor-http-nio-4] DEBUG o.s.b.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'Sybase' 2025-10-16 10:46:02.391 [reactor-http-nio-4] DEBUG o.s.jdbc.support.SQLErrorCodesFactory - Looking up default SQLErrorCodes for DataSource [com.hvlink.config.DataSourceConfig$1@34440990] 2025-10-16 10:46:02.407 [reactor-http-nio-4] DEBUG o.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource 2025-10-16 10:46:02.407 [reactor-http-nio-4] DEBUG o.s.jdbc.support.SQLErrorCodesFactory - SQL error codes for 'Microsoft SQL Server' found 2025-10-16 10:46:02.407 [reactor-http-nio-4] DEBUG o.s.jdbc.support.SQLErrorCodesFactory - Caching SQL error codes for DataSource [com.hvlink.config.DataSourceConfig$1@34440990]: database product name is 'Microsoft SQL Server' 2025-10-16 10:46:02.407 [reactor-http-nio-4] DEBUG o.s.j.support.SQLErrorCodeSQLExceptionTranslator - Translating SQLException with SQL state 'S0001', error code '207', message [列名 'order_no' 无效。] for task [ ### Error querying database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 列名 'order_no' 无效。 ### The error may exist in com/hvlink/mapper/asn/AsnMainMapper.java (best guess) ### The error may involve defaultParameterMap ### The error occurred while setting parameters ### SQL: SELECT id,company_code,factory_code,warehouse_code,shipper_id,asn_no,status,production_batch,shipping_date,estimated_arrival_date,estimated_consumption_time,is_first_product,is_fully_shipping,release_date,version_no,approval_code,type,order_no,supplier_code,is_deleted,create_by,create_time,update_by,update_time FROM tb_asn_main WHERE (id = ?) ### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 列名 'order_no' 无效。 ] 2025-10-16 10:46:02.490 [reactor-http-nio-4] DEBUG o.s.w.r.r.m.a.RequestMappingHandlerAdapter - [a18754e0-3] Using @ExceptionHandler com.hvlink.exceptions.ExceptionHandle#handleException(Exception) 2025-10-16 10:46:02.506 [reactor-http-nio-4] ERROR com.hvlink.exceptions.ExceptionHandle - ===服务器内部错误== org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 列名 'order_no' 无效。 ### The error may exist in com/hvlink/mapper/asn/AsnMainMapper.java (best guess) ### The error may involve defaultParameterMap ### The error occurred while setting parameters ### SQL: SELECT id,company_code,factory_code,warehouse_code,shipper_id,asn_no,status,production_batch,shipping_date,estimated_arrival_date,estimated_consumption_time,is_first_product,is_fully_shipping,release_date,version_no,approval_code,type,order_no,supplier_code,is_deleted,create_by,create_time,update_by,update_time FROM tb_asn_main WHERE (id = ?) ### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 列名 'order_no' 无效。 ; bad SQL grammar []; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 列名 'order_no' 无效。 at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:236) Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: Assembly trace from producer [reactor.core.publisher.MonoFlatMap] : reactor.core.publisher.Mono.flatMap(Mono.java:3137) com.hvlink.service.impl.AsnMainServiceImpl.updateCancelReleaseStatus(AsnMainServiceImpl.java:1041) Error has been observed at the following site(s): *________Mono.flatMap ⇢ at com.hvlink.service.impl.AsnMainServiceImpl.updateCancelReleaseStatus(AsnMainServiceImpl.java:1041) |_ Mono.map ⇢ at org.springframework.http.codec.json.AbstractJackson2Encoder.encode(AbstractJackson2Encoder.java:150) |_ Mono.flux ⇢ at org.springframework.http.codec.json.AbstractJackson2Encoder.encode(AbstractJackson2Encoder.java:151) |_ Flux.singleOrEmpty ⇢ at org.springframework.http.codec.EncoderHttpMessageWriter.write(EncoderHttpMessageWriter.java:129) |_ Mono.switchIfEmpty ⇢ at org.springframework.http.codec.EncoderHttpMessageWriter.write(EncoderHttpMessageWriter.java:130) |_ Mono.flatMap ⇢ at org.springframework.http.codec.EncoderHttpMessageWriter.write(EncoderHttpMessageWriter.java:134) |_ checkpoint ⇢ Handler com.hvlink.controller.AsnMainController#updateCancelReleaseStatus(Integer) [DispatcherHandler] Original Stack Trace: at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:236) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) at com.sun.proxy.$Proxy124.selectList(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:166) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) at com.sun.proxy.$Proxy129.selectList(Unknown Source) at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectOne(BaseMapper.java:172) at java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:162) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) at com.sun.proxy.$Proxy129.selectOne(Unknown Source) at com.hvlink.service.impl.AsnMainServiceImpl.lambda$updateCancelReleaseStatus$29(AsnMainServiceImpl.java:1016) at reactor.core.publisher.MonoCallable.call(MonoCallable.java:92) at reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:127) at reactor.core.publisher.MonoFlatMap.subscribeOrReturn(MonoFlatMap.java:53) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:57) at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:157) at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:249) at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:210) at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:210) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.complete(MonoIgnoreThen.java:292) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onNext(MonoIgnoreThen.java:187) at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839) at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:151) at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839) at reactor.core.publisher.MonoZip$ZipCoordinator.signal(MonoZip.java:258) at reactor.core.publisher.MonoZip$ZipInner.onNext(MonoZip.java:347) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onNext(FluxDefaultIfEmpty.java:101) at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74) at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2400) at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2196) at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2070) at reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:192) at reactor.core.publisher.MonoFlatMap.subscribeOrReturn(MonoFlatMap.java:53) at reactor.core.publisher.Mono.subscribe(Mono.java:4475) at reactor.core.publisher.MonoZip.subscribe(MonoZip.java:129) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:240) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:203) at reactor.core.publisher.MonoFlatMap$FlatMapMain.onComplete(MonoFlatMap.java:181) at reactor.core.publisher.Operators.complete(Operators.java:137) at reactor.core.publisher.MonoZip.subscribe(MonoZip.java:121) at reactor.core.publisher.Mono.subscribe(Mono.java:4490) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:263) at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:157) at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74) at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:82) at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.innerNext(FluxConcatMap.java:282) at reactor.core.publisher.FluxConcatMap$ConcatMapInner.onNext(FluxConcatMap.java:863) at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2400) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.request(MonoPeekTerminal.java:139) at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:171) at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2196) at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2070) at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:96) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onSubscribe(MonoPeekTerminal.java:152) at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:55) at reactor.core.publisher.Mono.subscribe(Mono.java:4490) at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.drain(FluxConcatMap.java:451) at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.onSubscribe(FluxConcatMap.java:219) at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:201) at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:83) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) at reactor.core.publisher.Mono.subscribe(Mono.java:4490) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:263) at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) at reactor.core.publisher.MonoDeferContextual.subscribe(MonoDeferContextual.java:55) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) at reactor.netty.http.server.HttpServer$HttpServerHandle.onStateChange(HttpServer.java:1112) at reactor.netty.ReactorNetty$CompositeConnectionObserver.onStateChange(ReactorNetty.java:707) at reactor.netty.transport.ServerTransport$ChildObserver.onStateChange(ServerTransport.java:481) at reactor.netty.http.server.HttpServerOperations.onInboundNext(HttpServerOperations.java:626) at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:114) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) at reactor.netty.http.server.HttpTrafficHandler.channelRead(HttpTrafficHandler.java:230) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318) at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:750) Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 列名 'order_no' 无效。 at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:259) at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1695) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:648) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:567) at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7675) at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:4137) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:272) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:246) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:544) at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:59) at com.sun.proxy.$Proxy229.execute(Unknown Source) at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64) at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:64) at com.sun.proxy.$Proxy227.query(Unknown Source) at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81) at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62) at com.sun.proxy.$Proxy226.query(Unknown Source) at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:132) at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62) at com.sun.proxy.$Proxy226.query(Unknown Source) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:145) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) at com.sun.proxy.$Proxy124.selectList(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:166) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) at com.sun.proxy.$Proxy129.selectList(Unknown Source) at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectOne(BaseMapper.java:172) at java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:162) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) at com.sun.proxy.$Proxy129.selectOne(Unknown Source) at com.hvlink.service.impl.AsnMainServiceImpl.lambda$updateCancelReleaseStatus$29(AsnMainServiceImpl.java:1016) at reactor.core.publisher.MonoCallable.call(MonoCallable.java:92) at reactor.core.publisher.MonoCallableOnAssembly.call(MonoCallableOnAssembly.java:91) at reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:127) at reactor.core.publisher.MonoFlatMap.subscribeOrReturn(MonoFlatMap.java:53) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:57) at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:157) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539) at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839) at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:249) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539) at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539) at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:210) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539) at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:210) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.complete(MonoIgnoreThen.java:292) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onNext(MonoIgnoreThen.java:187) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539) at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839) at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:151) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539) at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839) at reactor.core.publisher.MonoZip$ZipCoordinator.signal(MonoZip.java:258) at reactor.core.publisher.MonoZip$ZipInner.onNext(MonoZip.java:347) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539) at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onNext(FluxDefaultIfEmpty.java:101) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539) at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539) at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2400) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.request(FluxOnAssembly.java:649) at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2196) at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2070) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onSubscribe(FluxOnAssembly.java:633) at reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:192) at reactor.core.publisher.MonoFlatMap.subscribeOrReturn(MonoFlatMap.java:53) at reactor.core.publisher.Mono.subscribe(Mono.java:4475) at reactor.core.publisher.MonoZip.subscribe(MonoZip.java:129) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:240) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:203) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onComplete(FluxOnAssembly.java:549) at reactor.core.publisher.MonoFlatMap$FlatMapMain.onComplete(MonoFlatMap.java:181) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onComplete(FluxOnAssembly.java:549) at reactor.core.publisher.Operators.complete(Operators.java:137) at reactor.core.publisher.MonoZip.subscribe(MonoZip.java:121) at reactor.core.publisher.Mono.subscribe(Mono.java:4490) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:263) at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:157) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539) at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539) at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:82) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539) at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.innerNext(FluxConcatMap.java:282) at reactor.core.publisher.FluxConcatMap$ConcatMapInner.onNext(FluxConcatMap.java:863) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539) at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539) at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2400) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.request(FluxOnAssembly.java:649) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.request(MonoPeekTerminal.java:139) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.request(FluxOnAssembly.java:649) at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:171) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.request(FluxOnAssembly.java:649) at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2196) at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2070) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onSubscribe(FluxOnAssembly.java:633) at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:96) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onSubscribe(FluxOnAssembly.java:633) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onSubscribe(MonoPeekTerminal.java:152) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onSubscribe(FluxOnAssembly.java:633) at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:55) at reactor.core.publisher.Mono.subscribe(Mono.java:4490) at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.drain(FluxConcatMap.java:451) at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.onSubscribe(FluxConcatMap.java:219) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onSubscribe(FluxOnAssembly.java:633) at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:201) at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:83) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) at reactor.core.publisher.Mono.subscribe(Mono.java:4490) at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:263) at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) at reactor.core.publisher.MonoDeferContextual.subscribe(MonoDeferContextual.java:55) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:64) at reactor.netty.http.server.HttpServer$HttpServerHandle.onStateChange(HttpServer.java:1112) at reactor.netty.ReactorNetty$CompositeConnectionObserver.onStateChange(ReactorNetty.java:707) at reactor.netty.transport.ServerTransport$ChildObserver.onStateChange(ServerTransport.java:481) at reactor.netty.http.server.HttpServerOperations.onInboundNext(HttpServerOperations.java:626) at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:114) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) at reactor.netty.http.server.HttpTrafficHandler.channelRead(HttpTrafficHandler.java:230) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318) at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:750) 2025-10-16 10:46:02.522 [reactor-http-nio-4] DEBUG o.s.w.r.r.m.annotation.ResponseBodyResultHandler - [a18754e0-3] Using 'application/json' given [*/*] and supported [application/json, application/*+json, application/x-ndjson, text/event-stream] 2025-10-16 10:46:02.522 [reactor-http-nio-4] DEBUG o.s.w.r.r.m.annotation.ResponseBodyResultHandler - [a18754e0-3] 0..1 [com.hvlink.common.Result<?>] 2025-10-16 10:46:02.522 [reactor-http-nio-4] DEBUG o.s.http.codec.json.Jackson2JsonEncoder - [a18754e0-3] Encoding [Result(status=500, msg=发现未知问题,请联系管理员!, data=null, timestamp=1760582762506)] 2025-10-16 10:46:02.522 [reactor-http-nio-4] DEBUG reactor.netty.http.server.HttpServerOperations - [a18754e0-1, L:/192.168.10.130:9002 - R:/192.168.10.130:20167] Decreasing pending responses, now 0 2025-10-16 10:46:02.522 [reactor-http-nio-4] DEBUG reactor.netty.http.server.HttpServerOperations - [a18754e0-1, L:/192.168.10.130:9002 - R:/192.168.10.130:20167] Last HTTP packet was sent, terminating the channel 2025-10-16 10:46:02.522 [reactor-http-nio-4] DEBUG reactor.netty.channel.ChannelOperations - [a18754e0-1, L:/192.168.10.130:9002 - R:/192.168.10.130:20167] [HttpServer] Channel inbound receiver cancelled (operation cancelled). 2025-10-16 10:46:02.522 [reactor-http-nio-4] DEBUG o.s.web.server.adapter.HttpWebHandlerAdapter - [a18754e0-3] Completed 500 INTERNAL_SERVER_ERROR 2025-10-16 10:46:02.522 [reactor-http-nio-4] DEBUG reactor.netty.http.server.HttpServerOperations - [a18754e0-1, L:/192.168.10.130:9002 - R:/192.168.10.130:20167] Last HTTP response frame
最新发布
10-17
你提供的日志和代码非常完整,我们可以从 **业务逻辑、事务控制、响应式编程(Reactor)与数据库操作的交互** 角度来深入分析问题。 --- ## 🔍 问题核心定位 ### ❌ 抛出异常: ``` Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 列名 'order_no' 无效。 ``` 这个错误发生在 `updateCancelReleaseStatus` 方法中: ```java AsnMainPO asnMain = asnMainMapper.selectOne( new LambdaQueryWrapper<AsnMainPO>().eq(AsnMainPO::getId, id) ); ``` 👉 **即使你使用了 `@Transactional`,但查询是在 `Mono.fromCallable()` 中执行的,且 MyBatis-Plus 自动生成 SQL 查询了存在的字段 `order_no`,导致 SQL 执行失败。** --- ## 🧩 关键点解析 ### ✅ 1. `@Transactional` 在 Reactor 中是否生效? > ⚠️ **答案:默认情况下生效!** Spring 的 `@Transactional` 是基于 **AOP + ThreadLocal** 实现的,而 Reactor 使用的是异步非阻塞线程模型(如 NIO 线程池),在 `Mono.fromCallable()` 或 `.flatMap()` 中切换了线程上下文,导致事务管理器无法正确绑定 Connection。 #### 🔎 日志也证明了这一点: ```log DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Creating new transaction... DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Committing JDBC transaction... DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Releasing JDBC Connection ... after transaction ``` ➡️ 这说明:**事务在进入 service 方法后立即开启并提交了!** > 因为你在 `fromCallable()` 外面并没有真正执行数据库操作,Spring 认为方法已执行完毕,提前结束事务。 --- ### ✅ 2. 数据库查询为何出现在事务关闭之后? 继续看日志: ```log // 事务已经完成提交 DEBUG o.s.jdbc.datasource.DataSourceTransactionManager - Releasing JDBC Connection ... // 后续才发起 selectOne 查询 DEBUG com.hvlink.mapper.asn.AsnMainMapper.selectList - ==> Preparing: SELECT ... order_no ... ``` 这说明: - `selectOne()` 实际上是在 **事务结束后才执行的**。 - 而它运行在一个新的非事务性连接上(由 MyBatis 自行获取连接)。 - 此时如果表结构匹配就会直接报错。 --- ### ✅ 3. 为什么 `@Transactional` 没有覆盖到 `fromCallable` 内部? 因为 `fromCallable` 是惰性的,它的内容直到被订阅才会执行,而且通常在原始调用线程中执行。 ```java return Mono.fromCallable(() -> { // 这里的代码可能运行在其他线程 AsnMainPO asnMain = asnMainMapper.selectOne(...); // ❌ 在事务内! }) ``` 📌 **结论:`@Transactional` 只能保护同步方法体内的同步数据库操作。对 Reactor 流中的异步操作无效。** --- ## ✅ 正确解决方案 要解决这个问题,必须做到两点: 1. ✅ 让数据库操作在事务上下文中执行; 2. ✅ 避免访问数据库存在的字段。 --- ## 💡 解决方案一:使用 `TransactionalOperator`(推荐) 这是 **Reactor + Spring Transaction 最佳实践方式**。 ### ✅ 修改 Service 实现类 ```java import org.springframework.transaction.reactive.TransactionalOperator; import org.springframework.beans.factory.annotation.Autowired; @Service public class AsnMainServiceImpl implements AsnMainService { @Autowired private TransactionalOperator transactionalOperator; // 注入事务操作符 @Override public Mono<Result<String>> updateCancelReleaseStatus(Integer id) { return prepareUpdateData(id) // 第一步:准备数据(含数据库查询) .transform(transactionalOperator::transactional) // 开启响应式事务 .flatMap(tuple -> performBusinessLogic(tuple.getT1(), tuple.getT2())) // 第二步:执行业务 .onErrorResume(e -> { log.error("取消发布ASN失败,ID: {}", id, e); return Mono.just(Result.fail("取消发布失败:" + e.getMessage())); }); } // Step 1: 查询数据(必须放在流中) private Mono<Tuple2<AsnMainPO, List<AsnDetailPO>>> prepareUpdateData(Integer id) { return Mono.fromCallable(() -> { AsnMainPO asnMain = asnMainMapper.selectOne( new LambdaQueryWrapper<AsnMainPO>().eq(AsnMainPO::getId, id) ); if (asnMain == null) { throw new BusinessException(ResultCode.ASN_NOT_FOUND); } if (!AsnStatusEnum.RELEASED.getCode().equals(asnMain.getStatus())) { throw new BusinessException(ResultCode.ASN_STATUS_NOT_RELEASED); } List<AsnDetailPO> details = asnDetailMapper.selectList( new LambdaQueryWrapper<AsnDetailPO>() .eq(AsnDetailPO::getAsnNo, asnMain.getAsnNo()) ); if (details.isEmpty()) { throw new BusinessException(ResultCode.ASN_DETAIL_EMPTY); } return Tuples.of(asnMain, details); }) .subscribeOn(Schedulers.boundedElastic()); // 使用支持阻塞操作的调度器 } // Step 2: 执行后续业务逻辑(SAP调用、更新状态等) private Mono<Result<String>> performBusinessLogic(AsnMainPO asnMain, List<AsnDetailPO> asnDetails) { return callSapInterfaceReactive(asnMain.getAsnNo(), "CANCEL", asnDetails) .then(rollbackOrderAvailableQuantityReactive(asnMain, asnDetails)) .then(Mono.fromRunnable(() -> { asnMain.setStatus(AsnStatusEnum.PENDING_RELEASE.getCode()); asnMain.setReleaseDate(null); asnMainMapper.updateReleaseStatus(asnMain.getId(), asnMain.getStatus(), asnMain.getReleaseDate()); })) .thenReturn(Result.success("取消发布成功")); } } ``` ### ✅ 配置类启用响应式事务支持(确保已配置) ```java @Configuration @EnableR2dbcRepositories @EnableTransactionManagement public class DatabaseConfig { @Bean public TransactionalOperator transactionalOperator(PlatformTransactionManager tm) { return TransactionalOperator.create(tm); } } ``` > ⚠️ 注意:你需要的是 `PlatformTransactionManager` 支持 JDBC/MyBatis(是 R2DBC)。上面例子适用于传统 JDBC + Reactor 混合场景。 --- ## ✅ 解决方案二:修复实体类字段映射错误 无论是否使用响应式事务,都必须处理 `order_no` 字段问题。 ### 在 `AsnMainPO.java` 中添加注解: ```java @TableField(exist = false) private String orderNo; ``` 否则任何 `select*` 操作都会失败。 --- ## ✅ 解决方案三:改用显式 SQL 查询(更安全) 避免依赖自动映射: ```java @Select("SELECT id, company_code, factory_code, warehouse_code, shipper_id, asn_no, status, " + "production_batch, shipping_date, estimated_arrival_date, estimated_consumption_time, " + "is_first_product, is_fully_shipping, release_date, version_no, approval_code, type, " + "supplier_code, is_deleted, create_by, create_time, update_by, update_time " + "FROM tb_asn_main WHERE id = #{id}") AsnMainPO selectByIdWithoutOrderNo(@Param("id") Integer id); ``` 然后替换 `selectOne()` 调用。 --- ## ✅ 建议补充:合理使用 Schedulers 由于你在 `fromCallable` 中执行了阻塞的 DB 操作,务必指定合适的调度器: ```java .subscribeOn(Schedulers.boundedElastic()) ``` 否则会阻塞 Netty I/O 线程,影响性能。 --- ## ✅ 最终修复后的关键流程图 ``` HTTP Request ↓ Controller → Service(updateCancelReleaseStatus) ↓ prepareUpdateData() → Mono.fromCallable(...) on boundedElastic ↓ .transform(txOperator::transactional) ← 开启事务 ↓ performBusinessLogic(...) → SAP调用 + 更新DB ↓ .commit() or .rollback() ↓ Result 返回客户端 ``` --- ##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值