今天在seata的开发者群里面看见一个很好的问题,现在准备分享给大家:
"请教一个问题,如果在for循环里面操作数据库,是每一次循环是一个分布式事务,还是整个for循环是一个分布式事务?"
群里的开发者大佬的回答如下:
"for所在的函数或调用它的函数有全局事务注解那么他属于一个全局事务
如果是for里所调的每个函数上面有全局事务注解,外面没有,那么就是每一个分布式事务了
分为2种 有没有for的函数有没有加本地事务注解,有的话只算一个分支事务,如果没加就是N个分支事务,性能明显下降
在for外加本地事务注解就是复用同一个connection,那么只会commit一次"
先看一个例子:
puclic class xxxx{
(1).
public void globalMethod(){
for(User user:userList){
(2).
user.getMethod();
(4).
yyyy.getMethod1();
}
}
}
(3).
xxxx.globalMethod();
个人针对大佬的回答的总结,分布式事务和本地事务出现的各种情况:
1.for外(3)或者(1)全局事务注解,里面不加--分布式事务,里面N个分支事务
2.for外(3)或者(1)本地事务,里面不加---一个本地事务
3.for外(3)或者(1)全局事务,里面(2)本地事务注解--分布式事务,N个分支事务
4.for外(3)或者(1)不加事务注解,里面(2)不加事务注解-无全局事务,N个本地事务
5.for外(3)或者(1)不加事务注解,里面(2)加本地事务注解--无全局事务,N个本地事务
6.for外(3)有全局事务注解,for所在函数(1)有本地事务注解--1个全局事务 1个分支事务,N个本地事务
如果有遗漏,给我留言,欢迎大家留言一起讨论。