baomidou / dynamic-datasource

dynamic datasource for springboot 多数据源 动态数据源 主从分离 读写分离 分布式事务
https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611
Apache License 2.0
4.67k stars 1.19k forks source link

注解与LocalTxUtil混用多段事务时报错 "connectionProxyMap" is null #667

Closed ChiMuYuan closed 1 month ago

ChiMuYuan commented 1 month ago

Please fill it out carefully, or it will be closed. 请认真填写,不然会直接关闭。

Enviroment

JDK Version(required): jdk17

SpringBoot Version(required): springboot3

dynamic-datasource-spring-boot-starter Version(required):

4.3.1 druid Version(optional): 1.2.23 # Describe what happened DSTransactional开启的事务中途提交后,开启第二段事务不做手动提交时报错。 现在业务中不适用注解,两段事务都采用`LocalTxUtil.startTransaction()`手动开启,并使用`LocalTxUtil.commit(TransactionContext.getXID());`手动结束可避免。 碰到这种注解和手动开启混用情况下bug,看需不需要改吧 Expected Result: ``` TransactionalTemplate.doExecute { String xid = LocalTxUtil.startTransaction(); ..... LocalTxUtil.commit(xid); ——> LocalTxUtil.commit(TransactionContext.getXID()); .... LocalTxUtil.rollback(xid); ——> LocalTxUtil.rollback(TransactionContext.getXID()); .... } ``` Actual Result: If there is an exception,or aop invalid,please attach the exception trace: ``` java.lang.NullPointerException: Cannot invoke "java.util.Map.values()" because "connectionProxyMap" is null at com.baomidou.dynamic.datasource.tx.ConnectionFactory.notify(ConnectionFactory.java:150) at com.baomidou.dynamic.datasource.tx.LocalTxUtil.commit(LocalTxUtil.java:91) at com.baomidou.dynamic.datasource.tx.TransactionalTemplate.doExecute(TransactionalTemplate.java:126) at com.baomidou.dynamic.datasource.tx.TransactionalTemplate.execute(TransactionalTemplate.java:94) at com.baomidou.dynamic.datasource.aop.DynamicLocalTransactionInterceptor.invoke(DynamicLocalTransactionInterceptor.java:59) ``` # Steps to reproduce - Step 1 ``` @DSTransactional @GetMapping("/test") public void test() throws Exception { Long id = IdWorker.getId(); testTableService.save(new TestTable().setId(id)); LocalTxUtil.commit(TransactionContext.getXID()); LocalTxUtil.startTransaction(); testTableService.updateById(new TestTable().setId(id).setOpTest("123")); } ``` - Step 2 - Step 3
huayanYu commented 1 month ago

不改了