分布式事务

事务面试题

断了今生、忘了曾经 提交于 2019-12-03 07:11:18
一 什么是事务?有什么用? 事务的特性ACID 事务提供了一种机制,可用来将一系列数据库更改归入一个逻辑操作。更改数据库后,所做的更改可以作为一个单元进行提交或取消。事务可确保遵循原子性、一致性、隔离性和持续性(ACID)这几种属性,以使数据能够正确地提交到数据库中。 1)原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作 要么都发生,要么都不发生。 2)一致性(Consistency)一个事务中,事务前后数据的完整性必须保持一致。 3)隔离性(Isolation)多个事务,事务的隔离性是指多个用户并发访问数据库时, 一个用户的 事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。 4)持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变 就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。 二 事务的并发会产生的问题有哪些 1.脏读 一个事务正在对数据进行更新操作,但是更新还未提交,另一个事务这时也来操作这组数据,并且读取了前一个事务还未提交的数据,而前一个事务如果操作失败进行了回滚,后一个事务读取的就是错误的数据,这样就造成了脏读 2.不可重复读 一个事务多次读取同一个数据,在该事务还未结束时,另一个事务也对该数据进行 了操作,而且在第一个事务两次读取之间,第二个事务对数据进行了更新,那么第一个

JTA分布式事务实践

喜夏-厌秋 提交于 2019-12-03 05:25:08
最近一直在研究怎么实现分布式事务,花了不少时间,测试工程启停测试了无数次,最终实现的时候其实也就是写一些配置文件,对于工程代码没什么影响。目前研究还不是很深入,对于全面崩溃恢复如何实现和测试还不清楚。本文先介绍基础的实现。 当业务需要在一个事务中操作多个不同的资源,例如多个 数据库 ,消息队列,缓存等,那么就需要使用分布式事务了。在 Java 中一般建议使用 JTA ,这样开发人员就不用关心什么叫 XA 协议,什么是两阶段提交协议。要使用 JTA 需要容器的支持,例如使用 JBOSS,WebSphere ;或者使用第三方组件例如 JOTM 、 Atomikos 。 JBOSS AS 现在改名叫 Wildfly 了,以便和 JBOSS EAP 区分,后文我也改叫 Wildfly 。 JOTM 看起来是个死项目,我不打算使用。 由于目前开发框架基于 spring +JPA 设计,所以本文的配置主要是在 spring 中。其实用 EJB 的话配置更简单,但需要容器支持。 一、Wildfly 中配置 JTA 1、 配置数据库驱动( oracle ) a) 首先按照以下路径新增目录: wildfly-9.0.0.CR1\modules\system\layers\base\com\oracle\ojdbc14\main b) 把驱动文件 ojdbc14.jar 复制到此目录下 c) 在

Day 37 SQL基础(五)

牧云@^-^@ 提交于 2019-12-03 05:01:07
目录 事务处理 开始事务 回滚事务 提交事务 事务的特性 存储引擎 什么是存储引擎 各存储引擎的特性 概览 各种存储引擎的特性 各存储引擎的介绍 视图 创建视图 删除视图 修改视图 触发器 创建触发器 删除触发器 存储过程 创建无参存储过程 创建有参存储过程 执行存储过程 删除存储过程 SQL函数 事务处理 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性 开始事务 start transaction 标识事务的开始 回滚事务 rollback 用来回退(撤销)SQL语句 select * from users; start transaction; update users set age = 18 where id = 120; delete from users where name = 'tiny'; rollback; select * from users; rollback只能在一个事务处理内使用,在执行一条start transaction命令之后 提交事务 commit 一般的MySQL语句都是直接针对数据库表执行和编写的.这就是所谓的隐含提交,即提交(写或保存)操作是自动进行的. 但是.在事务处理块中,提交不会隐含地进行.为进行明确的提交,使用commit语句 start transaction;

分布式事务的2PC、3PC和TCC

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-03 04:50:30
1、2PC协议   2PC 是二阶段提交(Two-phase Commit)的缩写,顾名思义,这个协议分两阶段完成。第一个阶段是准备阶段,第二个阶段是提交阶段,准备阶段和提交阶段都是由事务管理器(协调者)发起的,协调的对象是资源管理器(参与者)。二阶段提交协议的概念来自 X/Open 组织提出的分布式事务的规范 XA 协议,协议主要定义了(全局)事务管理器和(局部)资源管理器之间的接口。XA 接口是双向的系统接口,在事务管理器以及一个或多个资源管理器之间形成通信桥梁。Java 平台上的事务规范 JTA(Java Transaction API)提供了对 XA 事务的支持,它要求所有需要被分布式事务管理的资源(由不同厂商实现)都必须实现规定接口(XAResource 中的 prepare、commit 和 rollback 等)。   ①准备阶段:协调者向参与者发起指令,参与者评估自己的状态,如果参与者评估指令可以完成,参与者会写 redo 和 undo 日志,然后锁定资源,执行操作,但是并不提交。   ②提交阶段:如果每个参与者明确返回准备成功,也就是预留资源和执行操作成功,协调者向参与者发起提交指令,参与者提交资源变更的事务,释放锁定的资源;如果任何一个参与者明确返回准备失败,也就是预留资源或者执行操作失败,协调者向参与者发起中止指令,参与者取消已经变更的事务,执行 undo

企业分布式事务经典方案综述汇总

会有一股神秘感。 提交于 2019-12-03 02:56:41
基本概念 本地事务 事务由资源管理器(如DBMS)本地管理 优点:严格的ACID 缺点:不具备分布事务处理能力 全局事务(DTP模型) TX协议:应用或应用服务器与事务管理器的接口 XA协议:全局事务管理器与资源管理器的接口 优点:严格的ACID 缺点:效率非常低 两阶段提交 优点 准备后,仍可提交或回滚 准备时,一致性检查必须OK 准备后,事务结果仍然只在事务内可见 准备后,事务结果已经持久化 缺点: 潜在故障点多带来的脆弱性 准备后,提交前的故障引发一系列隔离与恢复难题 http://book.51cto.com/art/201309/410608.htm 跨域的全局事务(DTP模型) 缺点 更高的协议成本 脆弱,故障点多 故障影响大,恢复困难 复杂,更多架构与平台约束 java企业平台中的分布式事务实现 JTA 面向应用、应用服务器与资源管理器的高层事务接口 JTS JTA事务管理器的实现标准,向上支持JTA,向下通过CORBA OTS实现跨事务域的互操作性 EJB 优点 简单一致的编程模型 跨域分布处理的ACID保证 局限 DTP模型本身的局限 缺少充分公开的大规模、高可用、密集事务应用的成功案例 JMS与分布式事务: http://techv5.com/topic/1371/ 其它资源 ws-transaction标准 jbossTransaction系统 Paxos算法

分布式事务的背景(一)

可紊 提交于 2019-12-03 01:42:50
背景 LCN框架在2017年6月份发布第一个版本,从开始的1.0,已经发展到了5.0版本。 LCN名称是由早期版本的LCN框架命名,在设计框架之初的1.0 ~ 2.0的版本时框架设计的步骤是如下,各取其首字母得来的LCN命名。 锁定事务单元(lock) 确认事务模块状态(confirm) 通知事务(notify) 5.0以后由于框架兼容了LCN、TCC、TXC三种事务模式,为了避免区分LCN模式,特此将LCN分布式事务改名为TX-LCN分布式事务框架。 框架定位 LCN并不生产事务,LCN只是本地事务的协调工 TX-LCN定位于一款事务协调性框架,框架其本身并不操作事务,而是基于对事务的协调从而达到事务一致性的效果。 解决方案 在一个分布式系统下存在多个模块协调来完成一次业务。那么就存在一次业务事务下可能横跨多种数据源节点的可能。TX-LCN将可以解决这样的问题。 例如存在服务模块A 、B、 C。A模块是mysql作为数据源的服务,B模块是基于redis作为数据源的服务,C模块是基于mongo作为数据源的服务。若需要解决他们的事务一致性就需要针对不同的节点采用不同的方案,并且统一协调完成分布式事务的处理。 方案: 若采用TX-LCN分布式事务框架,则可以将A模块采用LCN模式、B/C采用TCC模式就能完美解决。 入门 随着互联化的蔓延,各种项目都逐渐向分布式服务做转换

Redis面试题总结

人走茶凉 提交于 2019-12-03 01:36:41
参考 https://blog.csdn.net/zdp072/article/details/50991116 https://blog.csdn.net/qq_34337272/article/details/80012284#commentBox 坑人无数的Redis面试题(未整理,写的很棒,超出了理论范围,结合实际中的问题,给出不错的解决方案) https://blog.csdn.net/u011405515/article/details/79190652 0 什么是Redis? Redis 是一个使用 C 语言写成的,开源的,基于内存的 key-value 数据库。 支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。 与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。目前,Vmware在资助着redis项目的开发和维护。 1 使用redis有哪些好处

分布式事务解决方案及实现

爷,独闯天下 提交于 2019-12-03 01:17:19
一、事务的ACID原则   数据库事务的几个特性:原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation)和持久性(Durabilily),简称就是ACID。 原子性:操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。 一致性:事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。 隔离性:在该事务执行的过程中,无论发生的任何数据的改变都应该只存在于该事务之中,对外界不存在任何影响。只有在事务确定正确提交之后,才会显示该事务对数据的改变。其他事务才能获取到这些改变后的数据。 持久性:当事务正确完成后,它对于数据的改变是永久性的。 二、什么是分布式事务   事务在单系统中的表现:多次数据库操作用事务进行管理,来保证ACID原则。            但是如果各个模块都是单独独立出来的微服务,进行了分布式部署,单系统里的事务将不能保证各个数据库操作的一致性,因此就需要分布式事务来进行统一管理。          三、分布式事务实现方案   现在的分布式事务实现方案有多种,有些已经被淘汰,如基于XA的两段式提交、TCC解决方案,还有本地消息表、MQ事务消息,还有一些开源的事务中间件,如LCN、GTS。   1

Redis 分布式锁的实现

匿名 (未验证) 提交于 2019-12-03 00:44:02
0X00 测试环境 CentOS 6.6 + Redis 3.2.10 + PHP 7.0.7(+ phpredis 4.1.0) [root@localhost ~]# cat /etc/ issue CentOS release 6.6 (Final) Kernel \r on an \m [root@localhost ~]# redis-server - v Redis server v = 3.2 . 10 sha= 00000000 : 0 malloc=jemalloc- 3.6 . 0 bits= 32 build= 8903a4502b3c9f88 [root@localhost ~]# php - v PHP 7.0 . 7 (cli) (built: Feb 11 2017 16 : 47 : 30 ) ( NTS ) Copyright (c) 1997 - 2016 The PHP Group Zend Engine v3. 0.0 , Copyright (c) 1998 - 2016 Zend Technologies with Xdebug v2. 5.5 , Copyright (c) 2002 - 2017 , by Derick Rethans 0X01 什么是分布式锁 redis 官网上对分布式锁的描述( https://redis.io

Nosql 数据库 MemCache、Redis、MongoDB 的区别

匿名 (未验证) 提交于 2019-12-03 00:43:02
1.memcached:单一键值对内存缓存的,做对象缓存无可替代的分布式缓存; 2.redis:是算法和数据结构的集合,快速的数据结构操作是他最大的特点,支持数据持久化; 3.mongodb 是 bson 结构、介于 rdb 和 nosql 之间的,更松散更灵活的,但是不支持事务,只用作非重要数据存储。 转载请标明出处: Nosql 数据库 MemCache、Redis、MongoDB 的区别 文章来源: https://blog.csdn.net/tlsxtk/article/details/92084613