在项目里面实现分布式事务,我们常用的一般有集中模式,分别是:AT模式,TCC模式,Saga模式。下面分别介绍下对应的业务场景。
一、AT模式
AT模式其实就是一个二阶段提交的模型,使用AT模式的时候,分布式数据库中,我们一般会配备一张undo_log的表,这样事务会在执行的时候,预先生成一个undo_log的信息,方便进行回滚。一般我在使用seata的时候,直接使用globalTransaction其实就是使用的T模式。
这里特别说明一下,传统的数据库的读隔离是读已提交,但是seata的隔离级别是读未提交,在seata中如果要求全部是读已提交,那么需要使用select for update的语句进行代理。
举个例子:如果我们要更新一个操作的时候: update product set productname = 'aaaa' where productname = 'bbb',
那么在一阶段的时候,一般是执行 select id,productname,stock from product where productname = 'bbb',例如查询后是:
id | productname | stock |
1 | bbb | 1 |
查询完后,这边还会再执行一下:select id,productname,stock from product where id = 1; 通过这里的id进行定位数据,然后组成一条可以回滚的日志记录,插入到undo_log里面去。
{ "branchId": 641789253, "undoItems": [{ "afterImage": { "rows": [{ "fields": [{ "name": "id", "type": 1, "value": 1 }, { "name": "productname", "type": 12, "value": "aaaa" }, { "name": "stock", "type": 12, "value": "1" }] }], "tableName": "product" }, "beforeImage": { "rows": [{ "fields": [{ "name": "id", "type": 4, "value": 1 }, { "name": "productname", "type": 12, "value": "bbb" }, { "name": "stock", "type": 12, "value": "1" }] }], "tableName": "product" }, "sqlType": "UPDATE" }], "xid": "xid:xxx" }
组成这样的json,方便进行回滚。在二阶段如果不成功的话,就直接执行回滚的信息
二、TCC模式
tcc模式就是自己定义try-confirm-cancel阶段的代码,这里在更新的时候,需要使用dto,这样子数据进行更齐全一点。不再多说。
三、saga模式
saga模式主要解决的是长事务的业务场景。他是描述的一整个业务场景流程中,在整个流程中,每一个参与者都提交自己的本地事务,当出现某一个参与者失败了,则补偿前面已经成功的参与者。所以需要开发一阶段的正向业务,还要开发二阶段的补偿业务。适用于业务流程长,业务流程多的场景里面。
还没有评论,来说两句吧...