1 LCN介紹
利用事務管理器,統一協調各個本地事務,實現事務的一致性。
特性:
1、一致性,通過TxManager協調控制與事務補償機制確保數據一致性
2、易用性,僅需要在業務方法上添加@TxTransaction注解即可
3、高可用,項目模塊不僅可高可用部署,事務協調器也可集群化部署
4、擴展性,支持各種RPC框架擴展,支持通訊協議與事務模式擴展
官方文檔:https://www.txlcn.org/zh-cn/docs/preface.html
源碼參考:https://gitee.com/wangliang1991/tx-lcn/tree/4.1.0/
2 tx-manager資源管理器改造
下載資源管理器代碼 tx-manager,進行改造,可自行調整注冊中心和redis集成等。
修改配置application.properties
調整端口、注冊中心配置,redis配置
3 分布式事務集成使用
3.1 微服務service-1改造
3.1.1 添加pom依賴配置
<!--分布式事務配置--> <dependency> <groupId>com.codingapi</groupId> <artifactId>transaction-springcloud</artifactId> <version>4.1.0</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.codingapi</groupId> <artifactId>tx-plugins-db</artifactId> <version>4.1.0</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <!--分布式事務配置-->
3.1.2 添加tx-manger地址配置
新增tx.properties
url=http://127.0.0.1:9000/tx/manager/
3.1.3 添加測試接口
@RestController
@RequestMapping("/test")
public class TestController {
private static Logger LOGGER = LoggerFactory.getLogger(TestController.class);
@Autowired
private IDemoService demoService;
@PostMapping(value = "/save", produces = "application/json;charset=utf-8")
@ResponseBody
public int save(){
return demoService.save();
}
}
public interface IDemoService {
List<Test> list();
int save();
}
@Service
public class DemoServiceImpl implements IDemoService /*,ITxTransaction*/ {
@Autowired
private ITestDao testDao;
private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);
@Override
public List<Test> list() {
return testDao.findAll();
}
/**
* @TxTransaction(isStart = false) //true:事務發起方 false: 事務參與方 ,默認為參與方
* 參與方添加注解@TxTransaction或者實現接口ITxTransaction效果一樣。
* @return
*/
@Override
@TxTransaction
@Transactional
public int save() {
int rs1 = testDao.save("test-service-2");
return rs1;
}
}
@Mapper
public interface ITestDao {
@Select("SELECT * FROM t_test")
List<Test> findAll();
@Insert("INSERT INTO t_test(name) VALUES(#{name})")
int save(@Param("name") String name);
}
3.2 微服務service-2改造
3.2.1 添加pom依賴配置
<!--分布式事務配置--> <dependency> <groupId>com.codingapi</groupId> <artifactId>transaction-springcloud</artifactId> <version>4.1.0</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.codingapi</groupId> <artifactId>tx-plugins-db</artifactId> <version>4.1.0</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <!--分布式事務配置-->
3.2.2 添加tx-manger地址配置
新增tx.properties
url=http://127.0.0.1:9000/tx/manager/
3.2.3 添加測試接口
@RestController
@RequestMapping("/test")
public class TestController {
private static Logger LOGGER = LoggerFactory.getLogger(TestController.class);
@Autowired
private IDemoService demoService;
@PostMapping(value = "/save", produces = "application/json;charset=utf-8")
@ResponseBody
public int save(){
return demoService.save();
}
}
public interface IDemoService {
List<Test> list();
int save();
}
@Service
public class DemoServiceImpl implements IDemoService {
@Autowired
private ServiceFeignClient serviceFeignClient;
@Autowired
private ITestDao testDao;
private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);
@Override
public List<Test> list() {
return testDao.findAll();
}
@Override
@TxTransaction(isStart = true) //true:事務發起方 false:事務參與方
@Transactional
public int save() {
int rs1 = testDao.save("test-service-2");
int rs2 = serviceFeignClient.save();
int v = 100/0;
return rs1+rs2;
}
}
@Mapper
public interface ITestDao {
@Select("SELECT * FROM t_test")
List<Test> findAll();
@Insert("INSERT INTO t_test(name) VALUES(#{name})")
int save(@Param("name") String name);
}
3.2.4 添加feign配置
@FeignClient(name = "service-1")
public interface ServiceFeignClient {
@PostMapping(value = "/test/save")
@ResponseBody
int save();
}
