分布式事务

1、线程安全
保证线程安全一般分成两种方式:锁和原子变量
原子变量:原子变量能够保证原子性的操作,意思是某个任务在执行过程中,要么全部成功,要么全部失败回滚,恢复到执行之前的初态,不存在初态和成功之间的中间状态。
例如CAS操作,要么比较并交换成功,要么比较并交换失败。由CPU保证原子性。通过原子变量可以实现线程安全。一般会通过while/for循环来重新执行,直到赋值成功。
在高度竞争的情况下,锁的性能将超过原子变量的性能,但是更真实的竞争情况下,原子变量的性能将超过锁的性能。

2、disruptor
https://tech.meituan.com/2016/11/18/disruptor.html

分布式事务:
刚性事务:
2PC/3PC (XA)
缺点:性能差、资源占用时间长、需要实现XA接口
柔性事务:
异步确保型
缺点:侵入性高、实时性差
纯补偿型
缺点:侵入性高、开发成本高、一致性差
TCC
缺点“侵入性高、开发成本高
最大努力通知
缺点:侵入性高、开发成本高、实时性差

Seata:
Ali 微服务架构下的分布式事务

XA:
XA是一个分布式事务协议,由Tuxedo提出。
XA中大致分为两部分:事务管理器和本地资源管理器。其中本地资源管理器往往由数据库实现,比如Oracle、DB2这些商业数据库都实现了XA接口,而事务管理器作为全局的调度者,负责各个本地资源的提交和回滚。
即,XA是一个协议,一套接口

2PC:
两阶段提交协议(The two-phase commit protocol,2PC)是XA用于在全局事务中协调多个资源的机制。
即,2PC 是一套XA用于实现分布式事务的机制,即具体实现方案。

//假设有两个库,userDB, transactionDB

//注册JDBC驱动
Class.forName(JDBC_DRIVER);
//打开连接
userDbConn=DriverManager.getConnection(USER_DB_URL, USER, PASS);
XAConnection xaUserConn = new MysqlXAConnection((com.mysql.jdbc.Connection), userDbConnn, logXaCommands);
XAResource rmUser = xaUserConn.getXAResource();

transDbConn=DriverManager.getConnection(TRANS_DB_URL, USER, PASS);
XAConnection xaTransConn = new MysqlXAConnection((com.mysql.jdbc.Connection), transDbConnn, logXaCommands);
XAResource rmTrans = xaTransConn.getXAResource();

//AP 请求TM执行一个分布式事务 ,TM生成全局事务id
byte[] gTRID="g12345".getBytes(); //全局事务id
int formatId = 1;

//分别执行 rmUser, rmTrans上的事务分支

//TM 生成rmTrans上的事务分支id
byte[] transid = "b00001".getBytes();
Xid xid1 = new MysqlXid(gtrid, transid, formatId);
//执行rmTrans上的事务分支
rmTrans.start(xid1, XAResource.TMNOFLAGS);
PreparedStateement insertSql = transDbConn.prepareStatement("insert int transTable ....");
insertSql.executeUpdate();
rmTrans.end(xid1, XAResource.TMSUCCESS);

//TM生成rmUser上的事务分支
byte[] user_id = "b00002".getBytes();
Xid xid2 = new MysqlXid(gtrid, user_id, formatId);
//执行userTrans上的事务分支
rmUser.start(xid1, XAResource.TMNOFLAGS);
PreparedStateement updateSql = userDbConn.prepareStatement("update Seller .....");
updateSql.executeUpdate();
rmUser.end(xid2, XAResource.TMSUCCESS);

//两阶段提交
//phase1:询问所有的RM准备提交事务分支
int rmTrans_prepare = rmTrans.prepare(xid1);
int rmUser_prepare = rmUser.prepare(xid2);

//phase2:提交所有分支
boolean onPhase = false; //T判断有2个事务分支看所以不能优化为一阶段提交

if(rmTrans_prepare == XAResoure.XA_OK && rmUser_prepare == XAResource.XA_ok) {
//所有事务分之 都prepare成功,提交所有事务分支
rmTrans.commit(xid1, onephase);
rmUser.commint(xid2, onePhase);
} else {
rmTrans.rollback(xid1);
rmUser.rollback(xid2);
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335