Best Efforts 1PC 跨库事务 LeetCode-579、查询员工的累计薪水,601、体育馆的人流量 为啥不推荐uuid作为Mysql的主键呢 手把手教学:linux下oracle升级至11.2.0.4 数据库专题——深入理解count(*)为什么这么慢 Linux中MySQL数据库的使用④-----常用查询语句、常用函数 mysql备份与恢复:完全备份,增量备份,基于位置点恢复,基于时间点恢复 MySQL数据库的编译安装过程 《MySQL 入门教程》第 28 篇 字符集与排序规则 PHP面试技巧 之 职场暗语知多少?! [Dubox]实测。还是原来的配方,还是一样的味道! 【剑指金九银十】程序员,如何做到不惑?(附四面拿到字节跳动offer全过程) 超厉害的阿里技术读物,1500页超全计算机系统底层解析宝典 【融中财经早报9.16】大数据杀熟行为10月1日起明令禁止 大数据时代,机器学习算法该如何升级? 怎么判断自己是否适合做程序员 一分钟告诉你什么是区块链 一个时代一个机会,DeFi的起点X-DeFi,如何玩转X-DeFi? RTX3080显卡已被用于挖矿!映众辟谣:工程师测试散热 2020-09-15 比特币相当于房地产,怎样利用比特币获得流动现金? 区块链安全事件与代码审计 fisco bcos solidity销毁合约,删除合约的方法 Linux 中 Golang 的安装和环境配置 Golang interface{} 转换为某个结构体 区块链知识系列 - Raft 共识 OpenHarmony开发者文档开源计划,快快加入吧 融合创新提升服务,大数据搭建信息网 长三角税收一体化按下“快进键” 河钢集团与海尔集团签署物联网生态战略合作协议 1一个拥有万物互联神话,让我们看物联网是如何蓬勃发展的? 重庆大数据产业研究院成立,首批专家服务团名单公布 百分点大数据技术团队:互联网舆情系统的架构实践 水泥大数据研究院郑建辉:四季度水泥价格仍有望冲击去年高位 中国物联网与绿色智慧城市发展论坛召开 欧普照明点亮智慧道路之光 Android & Kotlin:Retrofit + Hilt 实现 看妹子app Android - 控件抖动效果 DevEco studio 一直加载gradle android如何获取调试版及发布版安全码SHA1 Android手机获取IP地址的两种方法 Android Activity 启动过程详解(上) 思维破局:挣钱其实没那么难,关键是方式要对 大数据赋能全产业链 为市民提供“一杯好奶” 运用大数据实现节能减排精准化 2020最新拼多多Java面试版,五面拿到28K的Offer 中国电信(安徽)大数据产业园落户南岗科技园 打造华东区域云计算领头羊 深度解读!阿里腾讯滴滴字节首选,新一代大数据引擎Flink厉害在哪?附学习礼包 网络编程5:socket服务端和客户端代码实现 微信小程序 蓝牙重连异常 errCode:10004,errMsg:notifyBLECharacteristicValueChange:fail setNot 蓝桥杯--第八届省赛试题-电子钟程序设计 【TCP回声服务器】一篇文章帮助你看懂TCP!
您的位置:首页 >开发 >

Best Efforts 1PC 跨库事务

Best Efforts 1PC 跨库事务

一、背景介绍

分布式事务主要解决两种事务问题,一个是跨库事务,另一个是跨服务事务;跨库是指在一个事务里面包含多个数据源的数据库操作。跨服务是一个事务中包行多个不同的应用系统的服务。best efforts 1pc 主要解决的是一个应用服务中跨多个数据源的数据一致性问题,不能解决跨服务的一致性问题。跨服务的数据一致性需要通过两阶段、三阶段或者其他分布式方案来保证。

二、什么是Best Efforts 1PC模式

首先事务的实现方式是通过动态代理的方式对原方法进行增强,在原方法执行前关闭自动提交,原方法执行后调用commit方法显示的进行提交。详细可以参考着文章 https://blog.csdn.net/khuangliang/article/details/108458906。

每个事务Transaction必须在指定的数据源DataSource下进行操作来获取数据库连接Connection,对于多个数据源的数据库操作在一个事务中进行的时候就需要对应多个数据的Transactions,对于这些Transactions不能串行的一个一个操作完后提交,需要在数据库操作完后统一全部提交。Best Efforts 1PC就是通过这种方式实现的,应此它只涉及到一个提交的阶段,不需要额外的协调者,执行效率高。

insert() 方法是一个事务操作insert() {// 插入数据库1insertDb1(); 对应数据库操作分解---db1[begin; insert; commit]// 插入数据库2insertDb2(); 对应数据库操作分解----db2[begin; insert; commit]}

我们看个实例,在insert方法中涉及两个数据库的操作insertDb1和insertDb2,要保证insert方法的事务特性就不能在insertDb1入库了之后,然后在insertDb2入库这样串行的去操作,因为如果insertDb2失败了而insertDb1事务成功完成了那么insertDb1回滚不了。所以需要按照db1,db2[begin; insert;]—>[db2 commit, db1 commit] 这种方式去执行,打乱原有的操作顺序。通过这种后面的操作先提交前面的操作后提交的方式来确保insertDb2发生异常的化能正常回滚insertDb1操作。

三、Best Efforts 1PC适用场景和优劣

Best Efforts 1PC由于只有一个commit提交阶段因此执行效率高,非常适合那种分库sharding的对性能要求高的应用场景,但是对于应用突发宕机的这种情况还是可能会出现不一致的情况,例如上例中db2 commit成功后应用宕机了,db1 commit失败同样会造成数据的不一致性,这种场景就需要业务系统通过一定的方式来达到数据的最终一致性。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。