回滚

AOP实现LCN分布式事务手动回滚

半城伤御伤魂 提交于 2019-12-08 14:34:04
由于项目用了较为完善的异常处理机制,导致微服务在抛出异常时,立即被@ExpectionHandler捕捉掉了,造成LCN分布式事务无法捕捉到异常而无法回滚的情况。在查看LCN原理的时候,偶然发现可以获取LCN管理事务的事务组代号groupId,由此想到能不能通过这个ID来手动回滚达到目的。 原理 1. 在被调用服务异常抛出后,ExceptionHandler进行捕捉并会返回这些错误信息给被服务调用者,如果微服务调用成功,信息中错误码等于10000,如果不成功,那么错误码是不会等于10000的。那么在服务调用者将这些信息return之后,可以用aop来判断信息是否等于10000,如果不等于,拿到事务组groupId进行手动回滚。 2.如果获取LCN的groupId?LCN源码里有一个 MQTxManagerService 直接注入它: @Autowired MQTxManagerService mqTxManagerService; 然后TxTransactionLocal.current().getGroupId()拿到groupId,向tx-manager发送关闭事务的请求。 @AfterReturning(value = "firstPointCut()",returning = "result") public void rollback(JoinPoint

TX-LCN分布式事务原理介绍

风流意气都作罢 提交于 2019-12-08 14:33:45
框架介绍 LCN分布式事务框架其本身并不创建事务,而是基于对本地事务的协调从而达到事务一致性的效果 核心步骤 创建事务组 是指在事务发起方开始执行业务代码之前先调用TxManager创建事务组对象,然后拿到事务标示GroupId的过程。 添加事务组 添加事务组是指参与方在执行完业务方法以后,将该模块的事务信息添加通知给TxManager的操作。 关闭事务组 是指在发起方执行完业务代码以后,将发起方执行结果状态通知给TxManager的动作。当执行完关闭事务组的方法以后,TxManager将根据事务组信息来通知相应的参与模块提交或回滚事务。 事务控制原理 LCN事务控制原理是由事务模块TxClient下的代理连接池与TxManager的协调配合完成的事务协调控制。 TxClient的代理连接池实现了 javax.sql.DataSource 接口,并重写了 close 方法,事务模块在提交关闭以后TxClient连接池将执行"假关闭"操作,等待TxManager协调完成事务以后在关闭连接。 对于代理连接池的优化 自动超时机制 任何通讯都有最大超时限制,参与模块在等待通知的状态下也有最大超时限制,当超过时间限制以后事务模块将先确认事务状态,然后再决定执行提交或者回滚操作,主要为了给最大资源占用时间加上限制。 智能识别创建不同的连接 对于只读操作、非事务操作LCN将不开启代理功能

LCN分布式事务原理介绍

ぃ、小莉子 提交于 2019-12-08 14:33:33
架介绍 LCN分布式事务框架其本身并不创建事务,而是基于对本地事务的协调从而达到事务一致性的效果 GITHUB地址: https://github.com/codingapi/tx-lcn 官方网址 https://www.txlcn.org 核心步骤 创建事务组 是指在事务发起方开始执行业务代码之前先调用TxManager创建事务组对象,然后拿到事务标示GroupId的过程。 添加事务组 添加事务组是指参与方在执行完业务方法以后,将该模块的事务信息添加通知给TxManager的操作。 关闭事务组 是指在发起方执行完业务代码以后,将发起方执行结果状态通知给TxManager的动作。当执行完关闭事务组的方法以后,TxManager将根据事务组信息来通知相应的参与模块提交或回滚事务。 事务控制原理 LCN事务控制原理是由事务模块TxClient下的代理连接池与TxManager的协调配合完成的事务协调控制。 TxClient的代理连接池实现了javax.sql.DataSource接口,并重写了close方法,事务模块在提交关闭以后TxClient连接池将执行"假关闭"操作,等待TxManager协调完成事务以后在关闭连接。 对于代理连接池的优化 自动超时机制 任何通讯都有最大超时限制,参与模块在等待通知的状态下也有最大超时限制,当超过时间限制以后事务模块将先确认事务状态

centos7 搭建SVN 以及client使用指南(Tortoise)

廉价感情. 提交于 2019-12-08 12:38:13
1:server搭建转载: https://blog.csdn.net/helijie92902/article/details/51935122?foxhandler=RssReadRenderProcessHandler 2:client搭建转载:https://blog.csdn.net/maplejaw_/article/details/52874348 这篇文章源于6月份给公司新人作的关于SVN使用的培训,转眼已经过了几个月的时间,丢了也怪可惜的,于是整理出来希望能够帮助后来人快速入门。 安装说明 使用说明 检出项目 导入项目 提交 更新 查看日志 版本回滚 版本控制 总结 安装说明 开发人员强烈建议使用IDE中的SVN插件更加智能与人性化。 首先安装SVN客户端,windows一般选择乌龟客户端 https://tortoisesvn.net/downloads.html 。(包含语言包) 根据系统位数选择相应客户端进行安装。 如果你喜欢用命令行操作,请务必记得勾选 command line client tool 为 will be install on local hard driver ,不用命令行的跳过这一步。 然后一路next即可安装。安装完毕后,在任意地方右键查看快捷菜单。发现 TortoiseSVN 即表示安装成功。 如果勾选了安装命令行工具

SVN的安装和使用手册

ぐ巨炮叔叔 提交于 2019-12-08 12:15:13
下载`TortoiseSVN 官网下载址 : https://www.visualsvn.com/visualsvn/download/tortoisesvn/ 下载完成后是这样的 安装 TortoiseSVN : 此处的安装地址建议不动,当然你也可以选择你要安装的地址 安装完成后在桌面点击右键查看 如果有标记的两个文件说明已经安装成功. 如果感觉英语看到有点困难的可以安装汉化TortoiseSVN: 下载语言包 : 下载地址: http://tortoisesvn.net/downloads.html 下载完后直接点下一步就 OK 了。 选择中文确定就ok了。 使用说明 检出项目 假如项目已经在服务器的仓库里,那么现在你要做的就是把它检出到本地。 首先创建一个空文件夹。在空文件夹内右键,选择 SVN 检出。 现在你看到应该是这个界面,填入版本库地址,选择确定。 如果是第一次登陆,此时会弹出一个对话框让你输入账号密码,输入你的账号密码即可。记得勾选保存认证,不然每次操作都会让你输入。 过几秒就会检出完成 找到目录就可以开始工作了 导入项目 右键选着版本浏览器 根据自己的项目上传你的文件或者文件夹 选着你的项目或者文件后 确定看到目录完成就行了 但是,不要以为导入成功就可以了。你还得重新检出,重新检出的项目才是受SVN控制的,务必记得检出,如果不检出你操作的属于你没有上传之前的文件

iDB是如何运转的 一

[亡魂溺海] 提交于 2019-12-07 16:33:48
郑昀 创建于2015/12/2 最后更新于2015/12/4 关键词:数据库,MySQL,自动化运维,DDL,DML,SQL审核,备份,回滚,Inception,osc 每个大型互联网公司都有一个数据库自动化运维系统,比如 Qunar 有 Inception(已开源),美团也有,赶集网的3个 DBA 开发了一个变更自助发布系统,淘宝和新浪呢都叫 iDB,腾讯互动娱乐团队有个 TMySQL。 大家都做这件事,一定是因为当数据量大到一定程度,数据重要到一定程度时,online schema change 和刷库不容有失,第一解决锁表问题,不能影响线上业务,第二搞定操作回滚问题,第三解救 DBA 于倒悬。我们的实现请参考《 #研发解决方案#iDB-数据库自动化运维平台 》。 0x00,普通DBA和文艺DBA怎么做SQL审核 无论是 DDL 操作,还是数据订正(也被称为 DML 操作),都涉及 SQL 审核、预执行和数据备份及回滚。 1 ,普通 DBA 青年的做法是: Dev 或 CM 给 DBA 发执行脚本, DBA 肉眼审核, 语法错误/语义错误/不符合规范/…… 驳回,修改,审核,再驳回,……,通过, DBA 执行前做一次全表备份, 援引 Inception 文档的原话: 『 备份是必要的,因为语句在没有执行时,都是想不到它影响会有多大 ,一般是不需要, 而需要时

SQLite学习手册(锁和并发控制)

北城以北 提交于 2019-12-06 16:06:16
一、概述: 在SQLite中,锁和并发控制机制都是由pager_module模块负责处理的,如ACID(Atomic, Consistent, Isolated, and Durable)。在含有数据修改的事务中,该模块将确保或者所有的数据修改全部提交,或者全部回滚。与此同时,该模块还提供了一些磁盘文件的内存Cache功能。 事实上,pager_module模块并不关心数据库存储的细节,如B-Tree、编码方式、索引等,它只是将其视为由统一大小(通常为1024字节)的数据块构成的单一文件,其中每个块被称为一个页(page)。在该模块中页的起始编号为1,即第一个页的索引值是1,其后的页编号以此类推。 二、文件锁: 在SQLite的当前版本中,主要提供了以下五种方式的文件锁状态。 1). UNLOCKED: 文件没有持有任何锁,即当前数据库不存在任何读或写的操作。其它的进程可以在该数据库上执行任意的读写操作。此状态为缺省状态。 2). SHARED: 在此状态下,该数据库可以被读取但是不能被写入。在同一时刻可以有任意数量的进程在同一个数据库上持有共享锁,因此读操作是并发的。换句话说,只要有一个或多个共享锁处于活动状态,就不再允许有数据库文件写入的操作存在。 3). RESERVED: 假如某个进程在将来的某一时刻打算在当前的数据库中执行写操作,然而此时只是从数据库中读取数据

MySQL中事务的分类

帅比萌擦擦* 提交于 2019-12-06 11:41:39
从事务理论的角度来看,可以把事务分为以下几种类型 扁平事务(Flat Transactions) 带有保存点的扁平事务(Flat Transactions with Savepoints) 链事务(Chained Transactions) 嵌套事务(Nested Transactions) 分布式事务(Distributed Transactions) 扁平事务 是事务类型中最简单的一种,但是在实际生产环境中,这可能是使用最频繁的事务,在扁平事务中,所有操作都处于同一层次,其由BEGIN WORK开始,由COMMIT WORK或ROLLBACK WORK结束,其间的操作是源自的,要么都执行,要么都回滚,因此扁平事务是应用程序称为原子操作的的基本组成模块 下面显示了扁平事务的三种不同结果 给出的扁平事务的三种情况,同时也给出了一个典型的事务处理应用中,每个结果大概占用的百分比。再次提醒,扁平事务虽然简单,但是在实际环境中使用最为频繁,也正因为其简单,使用频繁,故每个数据库系统都实现了对扁平事务的支持 扁平事务的主要限制是不能提交或者回滚事务的某一部分,或分几个步骤提交。下面给出一个扁平事务不足以支持的例子。例如用户在旅行网站上进行自己的旅行度假计划,用户设想从杭州到意大利的佛罗伦萨,这两个城市没有直达的班机,需要用户预订并转呈航班,需要或者搭火车等待。用户预订旅行度假的事务为

多个数据库事务

徘徊边缘 提交于 2019-12-06 04:41:14
在我的PHP应用程序(使用symfony框架和Propel ORM构建)中,当我向MYSQL数据库添加记录时,我需要使用外部供应商提供的Web服务API更新外部MYSQL数据库。 问题是维护数据库完整性的最佳实践是什么。 举例来说,如果第一次更新成功,而第二次更新不成功,由于Web服务不可用,我必须能够 回滚第一次更新的事务,或 缓存对Web服务的调用,并继续调用Web服务,直到服务可用 一些其他可以保持多个数据库完整性的技术。 具体来说,我正在寻找类似的语法 void RootMethod() { using(TransactionScope scope = new TransactionScope()) { try { SomeMethod(); scope.Complete(); CallWebService(); } catch { scope.abort(); } } } 但不确定是否 这是一个很好的技术 或者这在symfony中是可行的,就像在C#中一样 你怎么看? 编辑:有人问我为什么需要两部分更新。 这是因为我正在创建一个连接到现有后端应用程序的前端应用程序。 我不想改变后端应用程序。 因此不可避免地会有一些重叠。 因此需要同步数据 另一个编辑:两部分事务必须一起完成,做一个cron作业同步表是不可取的 #1楼 这将是棘手的。 您需要2阶段提交才能获得可靠的解决方案

Spring中的事务回滚机制

房东的猫 提交于 2019-12-06 00:47:13
初学者笔记 问题:在Java项目汇中,添加@Transactional注解,报错之后,事务回滚未生效,数据仍插入数据库中.经查看报错位置位于新增成功之后.空指针异常. 一、特性 先了解一下@Transactional注解事务的特性,可以更好排查问题 1、service类标签(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spring事务管理,在每个业务方法执行时都会开启一个事务,不过这些事务采用相同的管理方式。 2、@Transactional 注解只能应用到 public 可见度的方法上。 如果应用在protected、private或者 package可见度的方法上,也不会报错,不过事务设置不会起作用。 3、默认情况下,Spring会对unchecked异常进行事务回滚;如果是checked异常则不回滚。 辣么什么是checked异常,什么是unchecked异常 java里面将派生于Error或者RuntimeException(比如空指针,1/0)的异常称为unchecked异常,其他继承自java.lang.Exception得异常统称为Checked Exception,如IOException、TimeoutException等   通俗一点:你写代码出现的空指针等异常,会被回滚,文件读写,网络出问题,spring就没法回滚了