回滚

布式事务和解决方案理论

≯℡__Kan透↙ 提交于 2020-01-08 18:54:12
原文作者:VectorJin https://juejin.im/post/5e066c9ff265da33b0718f89 1. 本地事务   事务Transaction由一组SQL组成,具有四个ACID特性 1.1 ACID Atomicity 原子性 构成事务的一组SQL,要么全部生效,要么全不生效,不会出现部分生效的情况 Consistency 一致性 数据库经过事务操作后从一种状态转变为另一个状态。可以说原子性是从行为上描述,而一致性是从结果上描述 isolation 隔离性 事务操作的数据对象 相对于 其他事务操作的数据对象相互隔离,互不影响 durability 持久性 事务提交后,其结果就是永久性的,即使发生宕机(非磁盘损坏) 1.2 事务实现   对于MySQL数据库(InnoDB存储引擎)而言,隔离性是通过不同粒度的锁机制来实现事务间的隔离;原子性、一致性和持久性通过redo log 重做日志和undo log回滚日志来保证的。    redo log: 当数据库对数据做修改的时候,需要把数据页从磁盘读到buffer pool中,然后在buffer pool中进行修改,那么这个时候buffer pool中的数据页就与磁盘上的数据页内容不一致,称buffer pool的数据页为dirty page 脏数据,如果这个时候发生非正常的DB服务重启

Spring事务原理

做~自己de王妃 提交于 2020-01-08 13:45:45
//相当于开启事务 //当我们execute的时候,就和服务端建立链接    dataSource.getConnection().createStatement(); //事务的回滚 dataSource.getConnection().rollback(); //默认的话是自动提交,所有的事务操作框架都会把autoCommit改成false,否则的话无法手动干预 dataSource.getConnection().setAutoCommit(false); //只读事务 dataSource.getConnection().setReadOnly(true); //事务的提交 dataSource.getConnection().commit(); 1、数据库操作,都会通过事务来管理 ACID,最大的问题,解决数据一致性的问题,能量守恒 分布式:分布式事务处理瞬时一致性,通常说的是最终的一致性(异步核对,主流的方式就通过日志) 事务的操作流程:事务只是一种思想,该如何用技术实现 像一般操作的Connection(接口)类,这个类是java客户端和数据库事务通信的桥梁,也就是一个包装类,就是一个TCP链接,底层就是socket 但java自己不实现,只是提供这个封装,提供这个JDK,让其他相关数据库厂商自己实现,所以我们要单独导入类似Mysql的jar包

持续化运维 DevOps

徘徊边缘 提交于 2020-01-08 11:58:44
1.持续性集成 Continuous Integration(CI) 持续集成:Continuous Integration,简称CI,意思是,在一个项目中,任何人对代码库的任何改动, 都会触发CI服务器自动对项目进行构建,自动运行测试,甚至自动部署到测试环境。 这样做的好处就是,随时发现问题,随时修复。因为修复问题的成本随着时间的推移而增长,越早发现,修复成本越低。 软件个人研发的部分向软件整体部分交付,频繁进行集成以便更快地发现其中的错误。 频繁检出代码、频繁提交代码、减少分支,回归主干、使用自动化构建、提交自测、及时反馈部署构建通知 2.持续交付:Continuous Delivery(CD) 在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」中。 持续交付优先于整个产品生命周期的软件部署,建立在高水平自动化持续集成之上。 3.持续部署: 是指当交付的代码通过评审之后,自动部署到生产环境中。持续部署是持续交付的最高阶段。 这意味着,所有通过了一系列的自动化测试的改动都将自动部署到生产环境。 持续集成操作流程 编码 -> 构建 -> 集成-> 测试 -> 交付 -> 部署 -> (回滚) 代码编写,完成代码功能模块。 构建,实现功能模块构建测试,保证该模块当前的可用状态。 测试,单元测试和集成测试,保证各个功能模块的完整性和稳定性。 交付

Oracle逻辑存储结构

旧时模样 提交于 2020-01-08 04:52:37
一、数据块(data blocks)   数据块是 Oracle 数据库逻辑存储结构中的最小单位,也是执行数据库输入输出的最小存储单位。通常 Oracle 数据块是操作系统块的整数倍。数据块的标准大小被写入到初始化参数 DB_BLOCK_SIZE 中, oracle 允许在同一个数据库中存在不同大小的数据块,与标准块大小不同的就是非标准块。 二、数据区( extent )   数据区是由一组连续的 Oracle 数据块所构成的 Oracle 存储结构,由一个或多个数据块组成。一个或多个数据区组成一个段,当段中所有空间被使用完后, Oracle 系统将自动为该段分配一个新的数据区,可见,数据区是 Oracle 存储分配的最小单位。   使用数据区的目的是用来保存特定数据类型的数据,也是表中数据增长的基本单位。在 Oracle 数据库中,分配存储空间就是以数据区为单位的,一个 Oracle 对象包含至少一个数据区。设置一个表或索引的存储参数包含设置它的数据区大小。 三、段( segment )   段是由一个或多个数据区构成的,它不是存储空间的分配单位,而是一个独立的逻辑存储结构,用于存储表、索引或簇等占用空间的数据对象。一个段只属于一个特定的数据对象,每当创建一个具有独立段的数据对象时, Oracle 将为它创建一个段。 1.数据段:数据段中保存的是表中的数据记录。建表时

GIT---远程仓库版本回滚

空扰寡人 提交于 2020-01-07 11:31:46
开发中,发现有错误版本提交带远程分支master,怎么处理? 1 简介 最近在使用git时遇到了远程分支需要版本回滚的情况,于是做了一下研究,写下这篇博客。 2 问题 如果提交了一个错误的版本,怎么回退版本? 如果提交了一个错误的版本到远程分支,怎么回退远程分支版本? 如果提交了一个错误的版本到公共远程分支,又该怎么回退版本? 3 本地分支版本回退的方法 如果你在本地做了错误提交,那么回退版本的方法很简单 先用下面命令找到要回退的版本的commit id: git reflog 1 接着回退版本: git reset --hard Obfafd 1 0bfafd就是你要回退的版本的commit id的前面几位 4 自己的远程分支版本回退的方法 如果你的错误提交已经推送到自己的远程分支了,那么就需要回滚远程分支了。 首先要回退本地分支: git reflog git reset --hard Obfafd 1 2 紧接着强制推送到远程分支: git push -f 1 注意:本地分支回滚后,版本将落后远程分支,必须使用强制推送覆盖远程分支,否则无法推送到远程分支 5 公共远程分支版本回退的问题 看到这里,相信你已经能够回滚远程分支的版本了,那么你也许会问了,回滚公共远程分支和回滚自己的远程分支有区别吗? 答案是,当然有区别啦。 一个显而易见的问题:如果你回退公共远程分支

K8s资源对象的基本管理(升级、回滚、扩容、缩容)

邮差的信 提交于 2020-01-07 07:13:09
博文大纲: 一、资源创建 二、解决客户端无法访问k8s内部pod所运行的服务 三、搭建私有仓库,并自定义镜像 四、版本扩容、缩容 五、服务的升级与回滚 一、资源创建 本次博文主要介绍如何使用命令行的方式创建资源! [root@master ~]# kubectl run test --image=nginx:latest --replicas=5 //基于httpd的镜像创建一个deployment类型的控制组,名称为test,并指定副本数量为5 [root@master ~]# kubectl get deployments. //查看deployment控制器 NAME READY UP-TO-DATE AVAILABLE AGE test 5/5 5 5 6m26s //可以看到deployment的name是我们指定的test [root@master ~]# kubectl get replicasets. //查看replicasets这个控制器 NAME DESIRED CURRENT READY AGE test-66cbf74d74 5 5 5 7m50s //可以看到replicasets的NAME就是在deployment的NAME后面追加了一串ID号 [root@master ~]# kubectl get pod -o wide //查看pod的详细信息

Redo与Undo的理解

血红的双手。 提交于 2020-01-07 01:26:29
本文概要 本文分两部分, 第一部分概念介绍,重在理解。 第二部分通过MySQL Innodb中的具体实现,加深相关知识的印象。 本文的原意是一篇个人学习笔记,为了避免成为草草记录一下的流水账,尝试从给人介绍的角度开写。但在整理的过程中,越来越感觉力不从心,一是细节太多了,原以为足够了解的一个小知识点下可能隐藏了很多细节;二是内容与范围的取舍,既想有点技术性避免空谈,又不想陷入枯燥冗长的小细节描述。几番折腾,目前的想法把坑填上,能写完就不错了,你读起来有不顺或错误的地方请见谅,欢迎反馈。 1. 概念与理解 Redo与undo并非是相互的逆操作,而是能配合起来使用的两种机制。 说是两种机制,其实都是日志记录,不同的是redo记录以顺序附加的形式记录新值,如某条记录<T,X,V>,表示事物T将新值V存储到 数据库 元素X,新值可以保证重做; 而Undo记录通常以随机操作的形式记录旧值,如某条记录<T1,Y,9>,表示事物T1对Y进行了修改,修改前Y的值是9,旧值能用于撤销,也能供其他事务读取。 Redo用来保证事务的原子性和持久性,Undo能保证事务的一致性,两者也是系统恢复的基础前提。 1.1 Redo 一个事务从开始到结束,要么提交完成,要么中止,具有原子性。而反映在redo日志中可能需要若干条记录来保证,如: <T0 start> <T0,A,500> <T0,B,500> <T0

Liquibase 使用(全)

﹥>﹥吖頭↗ 提交于 2020-01-07 00:19:55
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 聊一个数据库脚本的版本工具 Liquibase, 官网在这里 ,初次看到,挺神奇的,数据库脚本也可以有版本管理,同类型的工具还有 flyway 。 开发过程经常会有表结构和变更,让运维来维护的话,通常会有很大的沟通成本,有时在开发方案有问题的时候,提测失败整个项目需要回滚,代码回滚起来是很容易的,通常有备份,但数据库的话就要人工来逐行分析并写出回滚语句,Liquibase 这时候就有用了。 Liquibase 适用场景感觉不多,所以可能有人没听过它的名头; 首先这种自动执行的家伙肯定是不适合于生产环境的,然后在数据量大的时候是不可能用数据库自带的 alter 语句的,一般都是手动创建另一张表,然后用 sql 语句将数据批量复制过去,再者使用容器化也比它好,个人觉得它一般用于开发和测试环境,比较厉害的一个功能是可以比较两个库的差异然后生成补丁包,上线时可以这么玩。 这篇文章 说得不错,我是在这篇基本上写的 核心概念 首先它是用于管理数据库版本的,所以就会有这些概念:版本号,管理的数据,差异比较,版本回滚 它的版本号由开发人员来维护,使用 author + id 管理的数据最小单元为 changeSet ,这个 changeSet 看官网说是可以用 xml,yaml,json,sql 来编写 提交数据,比较差异

分布式事务框架-seata初识

白昼怎懂夜的黑 提交于 2020-01-06 15:44:48
摘自: https://www.cnblogs.com/iceggboom/p/12144570.html 分布式事务框架-seata初识 一、事务与分布式事务 事务,在数据库中指的是操作数据库的最小单位,往大了看,事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。 那为什么会有分布式事务呢?单机事务是通过将操作限制在一个会话内通过数据库本身的锁以及日志来实现ACID.因为引入了分布式架构,所以事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上.简单说就是多各数据库之间无法保证保证各自的操作同时成功或同时失败。 二、介绍 Seata:Simple Extensible Autonomous Transaction Architecture,简易可扩展的自治式分布式事务管理框架,其前身是fescar。阿里巴巴GTS的开源版实现,是一种分布式事务的解决方案。 三、架构 Coordinator Core:最下面的模块是事务协调器核心代码,主要用来处理事务协调的逻辑,如是否 Commit、Rollback 等协调活动。 Store:存储模块,用来将我们的数据持久化,防止重启或者宕机数据丢失。 Discover:服务注册/发现模块,用于将 Server 地址暴露给 Client。 Config

oracle事务

半城伤御伤魂 提交于 2020-01-04 01:39:47
事务定义: (1)原子性:要么执行完成,要么不执行。 (2)一致性:业务逻辑一致性。例如:业务逻辑为,A表新增一条数据,B表需要更新一条数据,这两个操作需要都执行或者都不执行,就是一致性。此时,可以用@Transactional注解实现 (3)隔离性:多线程需要考虑隔离性,即线程1和线程2需要修改同一个表数据时,其中一个线程看到的要么是另一个线程执行完成或者未执行的结果,不会看到中间数据。 (4)永久性:事务一旦提交,则持久化保存在数据库中。 隔离级别 声明式事务的第二个方面是隔离级别。隔离级别定义一个事务可能受其他并发事务活动活动影响的程度。另一种考虑一个事务的隔离级别的方式,是把它想象为那个事务对于事物处理数据的自私程度。 在一个典型的应用程序中,多个事务同时运行,经常会为了完成他们的工作而操作同一个数据。并发虽然是必需的,但是会导致一下问题: 脏读(Dirty read)-- 脏读发生在一个事务读取了被另一个事务改写但尚未提交的数据时。如果这些改变在稍后被回滚了,那么第一个事务读取的数据就会是无效的。 不可重复读(Nonrepeatable read)-- 不可重复读发生在一个事务执行相同的查询两次或两次以上,但每次查询结果都不相同时。这通常是由于另一个并发事务在两次查询之间更新了数据。 幻影读(Phantom reads)-- 幻影读和不可重复读相似。当一个事务(T1