回滚

【分布式事务系列九】聊聊分布式事务

蓝咒 提交于 2019-12-01 11:12:07
#0 系列目录# 分布式事务 【分布式事务系列一】提出疑问和研究过程 【分布式事务系列二】Spring事务管理器PlatformTransactionManager 【分布式事务系列三】Spring的事务体系 【分布式事务系列四】分布式事务的概念 【分布式事务系列五】jotm的分布式案例 【分布式事务系列六】jotm分布式事务源码分析 【分布式事务系列七】Atomikos的分布式案例 【分布式事务系列八】JTA深度历险-原理与实现 【分布式事务系列九】聊聊分布式事务 #1 什么是事务# 事务就是一个会话过程中,对上下文的影响是一致的,要么所有的更改都做了,要么所有的更变都撤销掉。就要么生,要么死。没有半死不死的中间不可预期状态。 事务是为了保障业务数据的完整性和准确性的 。 #2 分布式事务# 分布式事务,常见的两个处理办法就是 两段式提交和补偿 。 两段式提交典型的就是XA ,有个事务协调器,告诉大家,来都准备好提交,大家回复,都准备好了,然后协调器告诉大家,一起提交,大家都提交了。 补偿比较好理解,先处理业务 ,然后定时或者回调里,检查状态是不是一致的,如果不一致采用某个策略,强制状态到某个结束状态(一般是失败状态),然后就世界太平了。典型的就是冲正操作。 比如对数据库来说,有redo日志的 。如果某个数据库这时候宕机了,那么它重启的时候,先执行检查

项目上线部署流程

余生颓废 提交于 2019-12-01 10:28:31
在项目部署上线的时候,会发生各种各样的错误。若按照步骤进行部署,错误便会大大的减少。步骤如下: 1、 需要知道有几台服务器,以及服务器环境搭建的情况。 2、 服务器是否在同一个机房 a) 在同一个机房 , 通过内网进行通信 -- 速度快 b) 不在同一个机房 , 通过外网通信 -- 速度慢 3、 服务器的硬件以及操作系统 如果应用程序对计算要求高,则部署在cpu核数较多的服务器。若果应用程序对内存要求较高,则部署在内存较多的服务器上。 应该合理的利用计算机的资源。 a) 硬件 内存 -- 多大 ? CPU -- 几核 ? 硬盘 -- 多大 ? IO读写速度 -- 机械硬盘还是 SSD (固态硬盘)? b) 操作系统 Windows? Linux? 32 ? 64 ? 4、 做最后的功能测试 5、 SVN 打 tag 与Maven打war包是不一样的,tag约定只读,不能修改其中的项目。项目都是基于tag去发布的。tag就是用于项目发布的。 6、 打包程序 ( Maven )maven打成war包。 7、 数据库脚本以及初始数据 数据库脚本及数据也是程序的一部分,不能忘记。 8、 编写发布文档 编写发布文档很重要,在项目发布的时候,总会出现各种各样的问题,所以需要写发布文档,根据文档一步一步操作去发布项目。 a) 要将发布的内容以及发布步骤都写下来 b) 回滚的机制 程序的回滚

有关系统架构高可用的原则

↘锁芯ラ 提交于 2019-12-01 10:14:14
降级。    对于一个高可用服务,很重要的一个设计就是降级开关。在设计降级开关时,主要有以下思路:     1.开关集中化管理:通过推送机制把开关推送到各个应用。     2.可降级的多级服务:比如服务调用降级为只读本地缓存,只读分布式缓存,只读默认降级数据(如库存状态默认有货)     3.开关前置化:如架构是nginx --> tomcat,可以将开关前置到nginx接入层,在nginx层做开关,请求流量不回源后端tomcat应用或者只是一小部分流量回源。     4.业务降级:当高并发流量来袭,在电商系统大促设计时保障用户能下单,能支付是核心要求,并保障数据最终一致性即可。这样就可以把一些同步调用改为异步调用,优先处理高优先级数据或特殊特征的数据,合理分配进入系统的流量,以保证系统可用。 限流      限流的目的是防止恶意请求流量、恶意攻击,或者防止流量超出系统峰值。可以考虑以下思路:     1.恶意请求流量只访问到cache。     2.对于穿透到后端应用的流量可以考虑使用nginx的limit模块处理。pinb     3.对于恶意IP可以使用nginx deny进行屏蔽。   这些操作的原则是限制流量穿透到后端薄弱的应用层。 可回滚    版本化的目的是实现可审计可追溯,并且可回滚。当程序或者数据出错时,如果有版本化机制,那么就可以通过回滚恢复到最近一个正确的版本

drop、truncate和delete的区别

隐身守侯 提交于 2019-12-01 10:13:39
(1)DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。 TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。 (2)表和索引所占空间。 当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小, DELETE操作不会减少表或索引所占用的空间。 drop语句将表所占用的空间全释放掉。 (3)一般而言,drop > truncate > delete (4)应用范围。 TRUNCATE 只能对TABLE; DELETE可以是table和view (5)TRUNCATE 和DELETE只删除数据, DROP则删除整个表(结构和数据)。 (6)truncate与不带where的delete :只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。 (7)delete语句为DML(data maintain Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的 tigger

Git基本命令

人盡茶涼 提交于 2019-12-01 07:10:23
# 初始化操作 # 配置用户名 git config --local user.name '名称' git config --local user.email '邮箱' # 初始化 git init #生成.git文件 用于保存相关所有信息,如:每个版本 # 查看 # 查看状态 git status # 查看日志 git log # 查看日志 git relog #查看日志(更全) # 查看分支中所有文件(版本) git ls-tree head # 查看暂存区和分支中的所有文件 git ls-files -s # 提交 # 将文件提交到暂存区 git add 文件名 (.代表所有文件) # 将文件提交到当前分支 git commit -m '描述' # 上面两句代码可以合成一句,有些版本不支持 git commit -a -m '描述' # 回滚 # 一步到位(直接从分支回滚到文件) git refset --hard 版本号 # 版本号可以用git log 或者 get relog查看 # 分步回滚 # 从分支回滚到暂存区 git reset --soft 版本号 # 回滚到修改过的内容 git reset head 文件名 # 回滚到原内容(回滚完成) git checkout -- 文件名 # 不加-- 也可以,但是为了区分checkout的切换分支功能,还是加上 #

git-查看历史版本及回滚版本

时间秒杀一切 提交于 2019-12-01 05:38:27
git-查看历史版本及回滚版本 查看历史提交版本: 1.git log 查看历史所有版本信息 2.git log -x 查看最新的x个版本信息 3.git log -x filename查看某个文件filename最新的x个版本信息(需要进入该文件所在目录) 4.git log --pretty=oneline查看历史所有版本信息,只包含版本号和记录描述 回滚版本: 1.git reset --hard HEAD^,回滚到上个版本 2.git reset --hard HEAD^~2,回滚到前两个版本 3.git reset --hard xxx(版本号或版本号前几位),回滚到指定版本号,如果是版本号前几位,git会自动寻找匹配的版本号 4.git reset --hard xxx(版本号或版本号前几位) filename,回滚某个文件到指定版本号(需要进入该文件所在目录) 来源: https://www.cnblogs.com/xiaogou/p/11660662.html

git回滚操作

≡放荡痞女 提交于 2019-12-01 05:29:07
一,找到之前的版本历史纪录,确定要回滚到那个版本号:git log 二,回滚到这个版本:git reset --hard 72229f823c8b21cbe52142a944d74f1883fa41aa 这样就回滚到这个版本了。 来源: https://www.cnblogs.com/chaojiyingxiong/p/11659974.html

Sequelize 中文文档 v4 - Transactions - 事务

南楼画角 提交于 2019-12-01 05:19:13
Transactions - 事务 此系列文章的应用示例已发布于 GitHub: sequelize-docs-Zh-CN . 可以 Fork 帮助改进或 Star 关注更新. 欢迎 Star. Sequelize 支持两种使用事务的方法: 一个将根据 promise 链的结果自动提交或回滚事务,(如果启用)用回调将该事务传递给所有调用 而另一个 leave committing,回滚并将事务传递给用户。 主要区别在于托管事务使用一个回调,对非托管事务而言期望 promise 返回一个 promise 的结果。 托管事务(auto-callback) 托管事务自动处理提交或回滚事务。你可以通过将回调传递给 sequelize.transaction 来启动托管事务。 注意回传传递给 transaction 的回调是否是一个 promise 链,并且没有明确地调用 t.commit() 或 t.rollback() 。 如果返回链中的所有 promise 都已成功解决,则事务被提交。 如果一个或几个 promise 被拒绝,事务将回滚。 return sequelize.transaction( function ( t ) { // 在这里链接您的所有查询。 确保你返回他们。 return User.create({ firstName : 'Abraham' , lastName

MYSQL事务的开启与提交

[亡魂溺海] 提交于 2019-12-01 02:41:47
MYSQL 事务处理主要有两种方法: 1、用 BEGIN, ROLLBACK, COMMIT来实现 BEGIN 开始一个事务 ROLLBACK 事务回滚 COMMIT 事务确认 2、直接用 SET 来改变 MySQL 的自动提交模式: SET AUTOCOMMIT=0 禁止自动提交 SET AUTOCOMMIT=1 开启自动提交 对于一个MYSQL数据库(InnoDB),事务的开启与提交模式无非下面这两种情况: 1>若参数autocommit=0,事务则在用户本次对数据进行操作时自动开启,在用户执行commit命令时提交,用户本次对数据库开始进行操作到用户执行commit命令之间的一系列操作为一个完整的事务周期。若不执行commit命令,系统则默认事务回滚。总而言之,当前情况下事务的状态是自动开启手动提交。 2>若参数autocommit=1(系统默认值),事务的开启与提交又分为两种状态: ①手动开启手动提交:当用户执行start transaction命令时(事务初始化),一个事务开启,当用户执行commit命令时当前事务提交。从用户执行start transaction命令到用户执行commit命令之间的一系列操作为一个完整的事务周期。若不执行commit命令,系统则默认事务回滚。 ②自动开启自动提交:如果用户在当前情况下(参数autocommit=1)未执行start