背景
数据库的水平分隔和微服务化的架构
一.产品选型
1.1、开源产品的比较
1.2、事务模式的比较
1.3、Seata的AT模式介绍
- 分支的运行时序图
- 防悬挂的措施
回滚时发现回滚undo还未插入,则自动插入一条log_status=1的undo记录。本地事务(业务写操作sql和对应undo为一个本地事务)提交时会因为undo表主键冲突而提交失败。
二、如何集成Seata
2.1、POM引入新依赖(必选)
<dependency>
<groupId>com.tao</groupId>
<artifactId>znsd-common-tx</artifactId>
<version>${common.version}</version>
</dependency>
2.2、配置信息(必选)
seata:
#默认是true;设置为false将关闭seata服务。
enabled: true
application-id: ${spring.application.name}
tx-service-group: znsd_tx_group
service:
vgroup-mapping:
e3plus_tx_group: default
registry:
nacos:
server-addr: ${spring.cloud.nacos.config.server-addr}
namespace: ${nacos_namespace:}
group : "SEATA_GROUP"
cluster: default
type: nacos
client.rm.lock.retryTimes: 1
client.rm.lock.retryPolicyBranchRollbackOnConflict: false
2.3、新增表(必选)
-- for AT mode you must to init this sql for you business database. the seata server not need it.
CREATE TABLE IF NOT EXISTS `undo_log`
(
`branch_id` BIGINT(20) NOT NULL COMMENT 'branch transaction id',
`xid` VARCHAR(100) NOT NULL COMMENT 'global transaction id',
`context` VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
`rollback_info` LONGBLOB NOT NULL COMMENT 'rollback info',
`log_status` INT(11) NOT NULL COMMENT '0:normal status,1:defense status',
`log_created` DATETIME(6) NOT NULL COMMENT 'create datetime',
`log_modified` DATETIME(6) NOT NULL COMMENT 'modify datetime',
UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8 COMMENT ='AT transaction mode undo table';
三、如何使用Seata
3.1、注解的方案
1、全局事务开始使用 @GlobalTransactional标识 。
2、每个本地事务方案仍然使用@Transactional标识。
3、@GlobalLock
有的方法它可能并不需要@GlobalTransactional的事务管理,但是我们又希望它对数据的修改能够加入到seata机制当中。那么这时候就需要@GlobalLock了。
加上了@GlobalLock,在事务提交的时候就回去checkLock校验一下全局锁。
4、客户端参数需关闭
client.rm.lock.retryPolicyBranchRollbackOnConflict: false
评论区