背景:随着互联网的快速发展,软件系统由原来的单体应用转变为分布式应用。分布式系统会把一个应用系统拆分为可独立部署的多个服务,因此需要服务与服务之间远程协作才能完成事务操作,这种分布式系统环境下由不同的服务之间通过网络远程协作完成事务称之为分布式事务,即大前提为分布式应用。
两阶段提交(2PC)
前提:是一个分布式项目,这里的demo以goods服务调用member服务为例,不同的服务在不同的数据库.
步骤:
1.我们这里使用阿里seata实现,https://github.com/seata/seata/releases先去这里下载.zip包解压之后有file.config文件加一段service用以配置服务,并且启动seata作为服务端TC。
2.配置完后把file.config和registry.config两个文件复制到两个服务中的resource文件夹下,接下来需要配置服务好让各个服务找到步骤1的服务端TC
3.配置一个回滚日志的数据库undo_log,每个服务的数据库都要建此表,此表会记录操作前和操作后的内容用以回滚,回滚后会把数据删除。
CREATE TABLE `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 DEFAULT CHARSET=utf8 COMMENT='AT transaction mode undo table';
4.seata对数据源做了代理和接管,在每个参与分布式事务的服务中,都要做如下配置
5.接下来以goods服务中的一个方法来作为例子
此为goods服务,在调用方方法上添加全局事务注解,调用member服务进行修改操作,之后再进行本服务的修改操作,在中间制造一种报错,正常结果为member服务的数据被回滚。