一、该问题的重现步骤是什么?
SpringUtil.publishEvent 发布事件, onApplicationEvent 订阅后续执行的代码mysql事务失效,且 tenantId 不会拼接到sql中。但是通过 AuthUtil.getTenantId 可以获取到租户Id
二、你期待的结果是什么?实际看到的又是什么?
三、你正在使用的是什么产品,什么版本?在什么操作系统上?
4.2.0
四、请提供详细的错误堆栈信息,这很重要。
五、若有更多详细信息,请在下面提供。
拼接租户ID问题已经解决,目前mysql事务不起作用。
事务相关的代码是怎么写的,发一下看看,发关键部分就行
事务注解
事件订阅
2024-12-04 13:12:20.251 INFO 45198 --- [nio-8202-exec-7] o.s.core.mp.plugins.SqlLogInterceptor : ============== Sql Start ============== Execute SQL : update bill_doc set `state` = 0, `audit_time` = null, `audit_user` = null where (id = 1863913145702961153) and tenant_id = '000000' Execute Time: 99.193ms ============== Sql End ============== 2024-12-04 13:12:41.829 INFO 45198 --- [nio-8202-exec-7] c.d.p.e.s.ItemInventorySubscriber : [订阅] 收到单据出入库事件, 单据Id:1863913145702961153, 操作类型:反审核 2024-12-04 13:12:46.008 INFO 45198 --- [nio-8202-exec-7] o.s.core.mp.plugins.SqlLogInterceptor : 2024-12-04 13:13:01.007 INFO 45198 --- [nio-8202-exec-7] o.s.core.mp.plugins.SqlLogInterceptor : ============== Sql Start ============== Execute SQL : update inventory set `category_id` = 1851586292367704065, `item_name` = '品名:', `sku_cost_price` = 333.00, `season_ids` = 'spring', `stock_num` = `stock_num` + -5 where (id = 1864136016849248258) and tenant_id = '000000' Execute Time: 37.772ms ============== Sql End ==============
这是执行的日志,同一个线程中运行的 [nio-8202-exec-7]
我找到原因了, SpringUtil 方法中把异常吃掉了, 这个需要怎么修复? 继续抛出来
public static void publishEvent(ApplicationEvent event) { if (context == null) { return; } try { context.publishEvent(event); } catch (Exception ex) { log.error(ex.getMessage()); } }
对外抛异常试试
{ .publishEvent(event); } (Exception ex) { .error(ex.getMessage()); ex; }
{ .publishEvent(event); //} (Exception ex) { // .error(ex.getMessage()); //}
这两种我测试了,都可以。 你们看一下有其他合适的方法吗? 就这个 log.error 要不要打印。看截图似乎log.error 是多余了
{ .publishEvent(event); } (Exception ex) { .error(ex.getMessage()); ex; }
或
// try {
context.publishEvent(event);
// } catch (Exception ex) {
// log.error(ex.getMessage());
// }
都可以
我截图了,两次发出来内容都变日志了。不知道啥原因
改成这样看看能不能正常抛异常并且回滚
/**
* 发布事件
*
* @param event 事件
*/
@SneakyThrows
public static void publishEvent(ApplicationEvent event) {
if (context == null) {
return;
}
context.publishEvent(event);
}
扫一扫访问 Blade技术社区 移动端