apache / incubator-seata

:fire: Seata is an easy-to-use, high-performance, open source distributed transaction solution.
https://seata.apache.org/
Apache License 2.0
25.22k stars 8.76k forks source link

求助:mybatisplus多数据源TCC模式 useTCCFence = true时调用服务时出现空指针异常 #5510

Open YokenLiao opened 1 year ago

YokenLiao commented 1 year ago

Ⅰ.java.lang.NullPointerException: null

private static DataSource dataSource; private static TransactionTemplate transactionTemplate; 断点这两个属性都是为null

Ⅱ. Describe what happened

If there is an exception, please attach the exception trace:

Just paste your stack trace here!

Ⅲ. Describe what you expected to happen

Ⅳ. How to reproduce it (as minimally and precisely as possible)

  1. xxx
  2. xxx
  3. xxx

Minimal yet complete reproducer code (or URL to code):

Ⅴ. Anything else we need to know?

Ⅵ. Environment:

Bughue commented 1 year ago

environment信息补充一下? 另外,不使用TCCfence的时候没问题吗?

funky-eyes commented 1 year ago

tcc不支持多数据源

running1900 commented 1 year ago

是啊,tcc不支持多数据源。 不过可以自己修改源码实现,我们已经实现了该功能 image

running1900 commented 1 year ago

image 这个问题也是困扰了我们很久,希望对楼主有帮助

running1900 commented 1 year ago

environment信息补充一下? 另外,不使用TCCfence的时候没问题吗?

多数据源,不使用TCCfence 也是会有问题的, rollback跟commit都是使用primary数据源的

Bughue commented 1 year ago

environment信息补充一下? 另外,不使用TCCfence的时候没问题吗?

多数据源,不使用TCCfence 也是会有问题的, rollback跟commit都是使用primary数据源的

堆栈发一下吧,我自己在我们内部是实现了对接sharding且用上这个功能的,没有你说的问题。 现在你们的问题是已经解决了?还是和楼主说的一样npe?

slievrly commented 1 year ago

@YokenLiao It is not recommended to operate multiple data sources in one branch transaction based on TCC best practices, but it is possible to implement dynamic switching of dataSources.

running1900 commented 1 year ago

environment信息补充一下? 另外,不使用TCCfence的时候没问题吗?

多数据源,不使用TCCfence 也是会有问题的, rollback跟commit都是使用primary数据源的

堆栈发一下吧,我自己在我们内部是实现了对接sharding且用上这个功能的,没有你说的问题。 现在你们的问题是已经解决了?还是和楼主说的一样npe?

我们没用使用shardingjdbc,而是跟楼主一样的使用了mybatisplus多数据源。 因为shardingjdbc 对外来说只有一个数据源的,通过内部的分片规则去路由的。而mybatisplus对外本身就是多数据源的,是需要通过程序手动去路由数据源,如果不设置就会使用primary的数据源。 若try时指定使用的是ds1(非primary)的数据源, commit或者rollback的时候默认就调用primary数据源,这时程序无法感觉是哪个数据源发起的try,即使知道也是无法手动切换的 因为commit跟rollback都在seata发起的事务里执行的

funky-eyes commented 1 year ago

environment信息补充一下? 另外,不使用TCCfence的时候没问题吗?

多数据源,不使用TCCfence 也是会有问题的, rollback跟commit都是使用primary数据源的

堆栈发一下吧,我自己在我们内部是实现了对接sharding且用上这个功能的,没有你说的问题。 现在你们的问题是已经解决了?还是和楼主说的一样npe?

我们没用使用shardingjdbc,而是跟楼主一样的使用了mybatisplus多数据源。 因为shardingjdbc 对外来说只有一个数据源的,通过内部的分片规则去路由的。而mybatisplus对外本身就是多数据源的,是需要通过程序手动去路由数据源,如果不设置就会使用primary的数据源。 若try时指定使用的是ds1(非primary)的数据源, commit或者rollback的时候默认就调用primary数据源,这时程序无法感觉是哪个数据源发起的try,即使知道也是无法手动切换的 因为commit跟rollback都在seata发起的事务里执行的

二阶段方法切面拦截,将切换的数据源作为参数传递到server,二阶段下发后进切面读取入参切换数据源行不行试试