什么是分布式事物
分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。(来自百度百科)
分布式事物的使用场景
上面介绍了什么是分布式事物, 我可以了解到分布式的事物一般使用在分布式系统中, 一个业务发起方A调用了其他节点B服务,然后B有调用了C服务
A--->B---C 形成一个链式的调用
在这个过程中需要有一个业务的发起者A
事物的参与者B, C
然后其实还有一个事物的协调或者管理者 事物的管理器(实现分布事物的核心功能)
LCN实现微服务的分布式事物
lcn: 官网地址http://www.txlcn.org/ LCN并不生产事务,LCN只是本地事务的搬运工 怎么理解这句话?
在github 提供了开源的框架https://github.com/codingapi/tx-lcn/
使用方法请参考:https://github.com/codingapi/springcloud-lcn-demo/tree/master/jpa-demo
细节地方:
这是服务A 事物的发起方 通过fein调用服务B 调用的链为:A-->B
import com.codingapi.tx.annotation.TxTransaction;
import com.netflix.discovery.converters.Auto;
import com.ninuxgithub.server.client.ProxyClient;
import com.ninuxgithub.server.entity.Person;
import com.ninuxgithub.server.repository.PersonRepository;
import com.ninuxgithub.server.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
public class PersonServiceImpl implements PersonService {
@Autowired
private PersonRepository personRepository;
@Autowired
private ProxyClient client;
@Override
public List<Person> list() {
return personRepository.findAll();
}
@Override
@TxTransaction(isStart = true)
@Transactional
public boolean savePerson(Person person) {
//访问server2 的save方法; 在同一个事物中调用其他的Service
client.save();
Person save = personRepository.save(person);
int v=100/0;
return save !=null;
}
}
这是服务B 事物的参与方
import com.codingapi.tx.annotation.TxTransaction;
import com.ninuxgithub.server.entity.Person;
import com.ninuxgithub.server.repository.PersonRepository;
import com.ninuxgithub.server.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
public class PersonServiceImpl implements PersonService {
@Autowired
private PersonRepository personRepository;
@Override
public List<Person> list() {
return personRepository.findAll();
}
@Override
@TxTransaction
@Transactional
public boolean savePerson(Person person) {
Person save = personRepository.save(person);
return save !=null;
}
}
在pom中引入
<dependency>
<groupId>com.codingapi</groupId>
<artifactId>transaction-springcloud</artifactId>
<version>${lcn.last.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.codingapi</groupId>
<artifactId>tx-plugins-db</artifactId>
<version>${lcn.last.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
A调用B的过程中
1.创建事物:在服务A开始执行之前 tx-manager会创建一个事物组, 拥有一个统一的事物groupID标示
2.添加事物:执行service A 的时候等serviceB执行完毕后将 执行的B模块的事物信息通知给tx-manager
3.关闭事务组:在服务A调用服务执行完毕后 将执行的状态通知给tx-manager .当执行关闭事务组的方法后, tx-manager将根据
事务组信息和相应参与模块提交或回滚事物。
所以lcn 并没有去参与事物的执行, 只是协调了事物而已, 所以说:‘LCN并不生产事务,LCN只是本地事务的搬运工’