1、@薛帅领 提问:
多数据源切换后,增加事务但不起作用(切数据源是执行方法后才切换的),本地事务及 Seate 分布式事务也不可以,这个有什么好的解决方案吗?
A:Spring 本地事务注解本身就不支持多数据源事务,且如果你开启了本地事务,之后并不会进入你的切换数据源的切面。在多数据源下,去掉本地事务注解就好了。用 globaltransactional 注解在多数据源的入口加上,多个数据源都被 Seata 代理的话,就会保证多数据源的事务。
2、@李天宇 提问
如果在分布式事务中,另一个线程做批处理 update 之类的,是否会锁住呢?
A:不会,另一个线程也要记得加上 globaltransactional 注解就行了。在 a 线程要提交之前要去尝试拿到它修改数据的全局锁的,如果 a 拿到了,但是还没到二阶段提交,b 也是要去尝试拿,拿不到就会不执行 SQL ,等待全局锁释放了,也就是 a 发起的事务结束了,b 才能执行 SQL 提交。这样就保证了利用全局锁(粒度行级),来达到隔离性。
Seata:https://github.com/seata/seata