分布式事务
[warning] 当有一个功能需要多个数据库同时提交或回滚,那么就会需要使用到分布式事务。
分布式事务支持2中方式:
- 本地事务JTA(单个服务中的事务)
- 全局事务SEATA(不同微服务之间的事事务)
本地事务JTA
[warning] 本地事务使用的是JTA分布式事务,如果需要使用本地事务,可以在
service
层中,方法上增加@Transactional
注解,增加注解后,即可实现事物处理。
@Transactional
public void addArticle(DataMap paramMap) {
}
[warning]
wueasy-data-datasource
工具包默认支持JTA分布式事务
,当有多个数据库连接时,会默认开启,如果只有一个数据库连接,则默认关闭。
JTA分布式事务配置
此处配置全局事务,如果关闭,将禁用事务
wueasy :
data:
transaction: #事务配置
enable: true #是否开启事务,true 是,false 否,默认 true,只有多个数据库连接,此配置才会生效
timeout: 10000 #事务超时时间,单位毫秒,默认 10000
单个数据库连接配置
配置信息放在数据库连接配置中。
wueasy :
data:
datasource :
demo :
transaction: true #事务是否启用,默认多个连接自动启用,也可以设置为false关闭当前连接事务
全局事务SEATA
[warning] 全局事务使用的是
seata
框架,可以支持到不同微服务之前的事务管理。
seata文档请参考http://seata.io/zh-cn/index.html
seata事务配置
wueasy :
data:
transaction: #事务配置
seata:
enable: true #启用状态,默认false
applicationId: #应用程序id,默认为txServiceGroup的配置
txServiceGroup: my_test_tx_group #默认服务器组,默认my_test_tx_group
代码中使用
主调用服务中需要增加@Transactional
和@GlobalTransactional
@Transactional(rollbackFor = {Throwable.class})
@GlobalTransactional(timeoutMills = 300000)
public void testSeata(DataMap paramMap) {
System.err.println("开始全局事务,XID = " + RootContext.getXID());
Demo demo = new Demo();
demo.setName("测试123");
demo.setCreatedTime(new Date());
demoMapper.insertSelective(demo);
Result<Void> result = new Client().invoke("DEMO002", paramMap);
if(result.getErrorNo()!=0) {
throw new InvokeException(result.getErrorNo(),result.getErrorInfo());
}
}
子服务中需要增加@Transactional
和@GlobalLock
@Override
@GlobalLock
@Transactional(rollbackFor = {Throwable.class})
public void testSeata(DataMap paramMap) {
Demo demo = new Demo();
demo.setName("test123");
demo.setCreatedTime(new Date());
demoMapper.insertSelective(demo);
if(true) {
throw new InvokeException(-1,"测试事务");
}
}