数据库事务

分布式事务中常见的三种解决方案

南笙酒味 提交于 2020-02-25 00:42:39
目录 一、分布式事务前奏 二、柔性事务解决方案架构 (一)、基于可靠消息的最终一致性方案概述 (二)、TCC事务补偿型方案 (三)、最大努力通知型 三、基于可靠消息的最终一致性方案详解 (一)、消息发送一致性 (二)、保证消息一致的变通做法 (三)、常规MQ消息处理流程和特点 (四)、消息重复发送问题和业务接口幂等性设计 (五)、本地消息服务方案 (六)、独立消息服务方案 (七)、消息服务子系统的设计实现 一、分布式事务前奏 事务:事务是由一组操作构成的可靠的独立的工作单元,事务具备ACID的特性,即原子性、一致性、隔离性和持久性。 本地事务:当事务由资源管理器本地管理时被称作本地事务。本地事务的优点就是支持严格的ACID特性,高效,可靠,状态可以只在资源管理器中维护,而且应用编程模型简单。但是本地事务不具备分布式事务的处理能力,隔离的最小单位受限于资源管理器。 全局事务:当事务由全局事务管理器进行全局管理时成为全局事务,事务管理器负责管理全局的事务状态和参与的资源,协同资源的一致提交回滚。 TX协议:应用或者应用服务器与事务管理器的接口。 XA协议:全局事务管理器与资源管理器的接口。XA是由X/Open组织提出的分布式事务规范。该规范主要定义了全局事务管理器和局部资源管理器之间的接口。主流的数据库产品都实现了XA接口。XA接口是一个双向的系统接口

Spring事务管理之几种方式实现事务(转)

我怕爱的太早我们不能终老 提交于 2020-02-25 00:30:35
转自 一:事务认识 大家所了解的事务Transaction,它是一些列严密操作动作,要么都操作完成,要么都回滚撤销。Spring事务管理基于底层数据库本身的事务处理机制。数据库事务的基础,是掌握Spring事务管理的基础。这篇总结下Spring事务。 事务具备ACID四种特性,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)的英文缩写。 (1)原子性(Atomicity)     事务最基本的操作单元,要么全部成功,要么全部失败,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。   (2)一致性(Consistency)     事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。   (3)隔离性(Isolation)     指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态

MySQL重要知识点(总结)

拥有回忆 提交于 2020-02-24 20:29:00
最近一段时间都学习mysql,将重要的知识点总结如下: 一、字段、表、索引设计规范相关 二、事务相关 三、锁相关 四、存储引擎相关 五、大表优化相关 六、索引优化相关 七、语句优化相关 一、字段、表、索引设计规范 1、字段设计规范 ① 字段类型优先选择符合存储需要的最小类型 字段类型优先级:整型>date;time >enum>char;varchar>blob 原因:整型,time运算快,节省内存;enum列内部是用整型存储的,char,varchar要考虑字符集的转换和排序的校对集,速度慢;blob无法使用临时表。 ② 够用就行(如smallint,varchar(N)) 原因:大的字段浪费内存,影响速度,如varchar(10),varchar(300),虽然存储的内容一样,但是,在表联查时,varchar(300)要花更多内存 ③ 尽量避免使用允许为null() 原因:null不利于索引,要用特殊的字节标注,在磁盘上占的空间其实更大 例子:建两个相同字段的表,一个允许为null,一个不允许。可以发现为null的索引更大些。 ④ 避免使用ENUM类型 修改ENUM值需要使用ALTER语句 ENUM类型的ORDER BY操作效率低,需要额外操作 禁止使用数值作为ENUM的枚举值 ⑤ 使用TIMESTAMP(4个字节)或DATETIME类型(8个字节)存储时间 TIMESTAMP

传送事务日志

孤人 提交于 2020-02-24 13:20:47
微软sql server2005 standby有两个解决方案,一是数据库镜像,而是传送事务日志。本文主要介绍传送事务日志需要注意的地方。生产环境的数据库原先的备份方式是,每天凌晨一个整备,每隔15分钟一个log备份。 第一步,主数据库上右击 任务 ,传送事务日志 第二步: 勾选将此数据库启用为日志传送配置中的数据库 注意:share为共享文件夹,本例将备份日志放到了辅助服务器上. 第三步: 点击 添加,按下图设置 注:temp1.bak为主数据库的最新完整备份文件,提前已将该备份拷入辅助数据库的share文件夹中. 第四步: 复制文件 必须输入备份所在地址 注:“在以下时间后删除复制的文件”的作业=复制作业,也就是本例中的LSCopy_temp1 第五步: 还原事务日志 注:选无恢复模式后,数据库一直处于还原状态,不能访问,无法验证数据的同步情况。 备用模式的好处就是可以在restore作业不执行的时候,执行select查询;需要注意的是,有查询连接辅助服务器时,restore会报错。所以尽量不要读取辅助数据库。 备用模式是通过产生一个tuf的文件来记录的。每进行一次restore,tuf文件就会recreate一次。 第六步: 作业执行几天后,出错啦!很多时候不是刚设置完成就暴露这个错误。 提示如下: 此备份集中的日志开始于 LSN 22000000007700001,该

MySQL学习笔记(8)

一世执手 提交于 2020-02-24 02:10:39
SQL的子查询: || 知识点很简单,主要是练习(之前笔记有练习) – MySQL学习笔记(实操)(6) – MySQL学习笔记(实操)(7) SQL的联结: || 什么是联结:两张表通过其中有关系的列进行联结,在有些时候,比复杂的子查询嵌套会更方便 || 所有联结都需要两个要素,1,被联接的表 2,联结方式 3,联结关系 || 联结方式一:where 联结 (使用情景:常用于等值联结) || 联结方式二:内联结 (使用情景:常用于等值联结) ( join 或 inner join ) mysql > select * from score inner join course on score . course_id = course . course_id ; + ------------+-----------+--------+-----------+-------------+------------+ | student_id | course_id | degree | course_id | course_name | teacher_id | + ------------+-----------+--------+-----------+-------------+------------+ | 103 | 3 - 105 | 92 | 3 - 105 |

mysql的事务隔离级别

痞子三分冷 提交于 2020-02-23 13:53:01
什么是事务   事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。   事务的结束有两种,当事务中的所以步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消撤消之前到事务开始时的所以操作。 事务的 ACID   事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。   1 、原子性。事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做   2 、一致性。事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。   3 、隔离性。一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。   4 、持续性。也称永久性,指一个事务一旦提交

JAVA事务系列二:JDBC事务

非 Y 不嫁゛ 提交于 2020-02-22 15:17:28
事务的提交和回滚: 在JDBC API中,默认的情况为自动提交事务和回滚事务,也就是说,每一条对数据库的更新的sql语句代表一项事务,操作成功后,系统自动调用commit()来提交,否则将调用rollback()来撤消事务。 可以通过调用setAutoCommit(false) 来禁止自动提交事务。然后把多条更新数据库的sql语句做为一个事务,在所有操作完成之后,调用commit()来进行整体提交。倘若其中一项 sql操作失败,就不会执行commit()方法,而是产生相应的sqlexception,此时就可以捕获异常代码块中调用rollback()方法撤消事务。 public int delete(int sID) {   dbc = new DataBaseConnection();   Connection con = dbc.getConnection();   try {    con.setAutoCommit(false);// 更改JDBC事务的默认提交方式    dbc.executeUpdate("delete from xiao where ID=" + sID);    dbc.executeUpdate("delete from xiao_content where ID=" + sID);    dbc.executeUpdate("delete from

数据库新特性

风格不统一 提交于 2020-02-22 15:07:00
控制事务持久性 SQL Server 2014之后事务分为2种:完全持久, 默认或延迟的持久。 完全持久,当事务被提交之后,会把事务日志写入到磁盘,完成后返回给客户端。 延迟持久,事务提交是异步的,在事务写入到磁盘前,事务提交返回给客户端。 以前都是完全持久,现在多了个延迟持久,延迟持久只有当日志缓存刷新的时候才会被写入到磁盘保证事务完整性。 目录 控制事务持久性 完全持久事务和延迟持久事务持久性 完全持久事务 延迟持久性事务 如何控制事务的持久性 数据库级别 存储过程级别 语句级别 如何强制日志刷新 延迟持续性和其他 SQL Server 功能 完全持久事务和延迟持久事务持久性 说白了,完成持久事务完全保证事务的持久性,延迟持久事务延迟保证事务的持久性。 完全持久事务 只要存在以下情况,就应使用完全持久事务: 1.系统无法承受任何数据丢失 2.造成性能瓶颈的原因不是事务日志写入延迟 完全持久事务保证 : 1.事务提交后,修改对其他事务时可见的。 2.完全保证事务的持久性 延迟持久性事务 延迟持久性事务,通过异步的把事务日志写入到磁盘来实现,在写入到磁盘之前,日志被保存在缓存区中,当缓冲区满了或者刷新缓冲区了把日志写入磁盘,依次来减少磁盘资源争用: 1.事务提交不用等待写入到磁盘完成 2.减少磁盘争用从而提高,事务吞吐量。 使用场景: 1.可以忍受一定数据的丢失 2

深入了解分布式.md

落花浮王杯 提交于 2020-02-21 18:57:17
深入了解分布式 分布式事务 分布式事务概念 分布式事务产生的原因 事务的ACID特性 分布式理论 CAP理论 BASE理论 分布式事务的应用场景 常见的分布式事务解决方案 两阶段提交 TCC编程模式 TCC开源框架-tcc-transaction TCC使用关键技术分析 分布式项目使用tcc-transaction框架 发布服务 调用服务 LCN解决方案 参考链接 分布式事务 分布式事务概念 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。 分布式事务是为了保证不同数据库的数据一致性 分布式事务产生的原因 数据库分库分表 当数据库单表一年产生的数据超过1000W,那么就要考虑分库分表 应用SOA化 所谓的SOA化,就是业务的服务化。现在对整个网站进行拆解,分离除了订单中心、用户中心、库存中心。 事务的ACID特性 原子性(Atomicity) 所谓的原子性就是说,在整个事务中的所有操作,要么全部完成,要么全部不做,没有中间状态。对于事务在执行中发生错误,所有的操作都会被回滚,整个事务就像从没被执行过一样。 一致性(Consistency) 事务的执行必须保证系统的一致性,就拿转账为例,A有500元,B有300元,如果在一个事务里A成功转给B50元,那么不管并发多少,不管发生什么,只要事务执行成功了

借鉴 spring 面试内容

风流意气都作罢 提交于 2020-02-21 16:40:29
1. Spring的IOC有三种注入方式 : 第一是根据属性注入,也叫set方法注入; 第二种是根据构造方法进行注入; 第三种是根据注解进行注入 Spring的优点 :主要是根据它的IOC和AOP体现的。IOC主要是解决了代码的耦合性问题,而AOP是面向切面编程的最好解释! 2.Spring中IOC, AOP IOC就是控制翻转或是依赖注入。通俗的讲就是如果在什么地方需要一个对象,你自己不用去通过new 生成你需要的对象,而是通过Spring的bean工厂为你长生这样一个对象。 AOP就是面向切面的编程。比如说你每做一次对数据库操作,都要生成一句日志。如果,你对数据库的操作有很多类, 那你每一类中都要写关于日志的方法。但是如果你用AOP,那么你可以写一个方法,在这个方法中有关于数据库操作的方法, 3.Spring的IOC/AOP/代理 IOC是控制反转,是Spring的核心思想。通过面向接口编程来实现对业务组件的动态依赖。 aop是面向切面编程,它并不是只在Spring或者java中才有的,它和面向对象编程(oop)是相对而言的另一种编程思想。 Spring在实现AOP编程时利用的是java的代理机制。个人觉得java代理机制真的是很神奇。核心内容并不多 4.Spring的IOC是解耦,AOP是干什么的 AOP面向切面编程将程序中的交叉业务逻辑(比如安全,日志,事务等)