事务

RocketMQ学习笔记(10)----RocketMQ的Producer 事务消息使用

拈花ヽ惹草 提交于 2020-03-23 06:51:46
1. 事务消息原理图  RocketMQ除了支持普通消息,顺序消息之外,还支持了事务消息。 1. 什么是分布式事务?   分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。 2. RocketMQ中分布式事务的使用   在RocketMQ中分布式事务执行过程分为三个阶段,RocketMQ第一阶段发送 Prepared消息 时,会拿到消息的地址,第二阶段执行本地事物,第三阶段通过第一阶段拿到的地址去访问消息,并修改消息的状态。当RocketMQ确认消息发送失败时,RocketMQ会定期扫描消息集群中的事物消息,如果发现了 Prepared消息 ,它会向消息发送端(生产者)确认,RocketMQ会根据发送端设置的策略来决定是回滚还是继续发送确认消息。这样就保证了消息发送与本地事务同时成功或同时失败。   实现方式:   Producer实现: package com.wangx.rocketmq.transaction; import org.apache.rocketmq.client

java事务(二)——本地事务

此生再无相见时 提交于 2020-03-23 06:05:47
本地事务 事务类型 事务可以分为本地事务和分布式事务两种类型。这两种事务类型是根据访问并更新的数据资源的多少来进行区分的。本地事务是在单个数据源上进行数据的访问和更新,而分布式事务是跨越多个数据源来进行数据的访问和更新。在这里要说的事务是基于数据库这种数据源的。 JDBC 事务 在 JAVA 中,我们使用 JDBC 来连接数据库,访问和更新数据。那么在 JDBC 中是如何实现事务的,事务是被谁来管理的?这个答案当然是数据库, JDBC 本身并没有处理事务的能力,而是依赖于底层数据库,底层数据库来提供事务的服务。在很多资料上会提到, JDBC 的事务是基于连接的,也就是那个 Connection 对象,这个连接的本质其实是连接到数据库的一个 Socket ,与数据库建立连接以后就可以向数据库发送指令和数据,最终数据库会根据接收到的指令和数据来进行增删改查以及事务的处理。另外,事务是被限制在单个连接上的,这就好像我们去银行的营业厅办理业务,营业厅有多个窗口,我们只会在自己的窗口上与银行工作人员进行沟通并处理自身的业务,而不能跨窗口,告诉别的窗口的工作人员把那哥们的钱转到自己卡上,这事也就只能想想。 数据库事务例子 下面先看一个 MYSQL 数据库事务的例子: 1、创建表 创建用户表 CREATE TABLE USERS ( USER_ID INT NOT NULL AUTO

从零开始的Redis

[亡魂溺海] 提交于 2020-03-22 19:29:51
3 月,跳不动了?>>> 1、初识Redis 官网: https://redis.io Redis(Remote Dictionary Server):远程字典服务。 是一个开源的使用ANSI C语言 编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库 ,并提供多种语言的API。 简单来说:Redis 是一个基于内存的高性能key-value数据库。通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。 ANSI :是一种字符代码 2、为什么要使用Redis Redis完全开源免费,遵守BSD协议,是高性能的key-value数据库。 Redis作为一种缓存工具,主要用于解决高并发的问题,在分布式系统中有着极其广泛的应用。 BSD协议,想要了解点击前往 2.1、Redis优点 速度快,性能高 --- Redis每秒可以处理超过10万次读写操作。 Redis能读的速度是110000次/s,写的速度是81000次/s 。 支持丰富的数据类型 --- 支持Strings、 Lists、 Hashes、 Sets、Ordered Sets 数据类型操作。 支持事务 --- Redis操作都是原子性的,所谓的原子性就是对数据的更改要么全部执行

分布式事务解决方案整理

╄→гoц情女王★ 提交于 2020-03-22 18:19:03
分布式事务解决方案整理 1.2PC/3PC模式 1.1 介绍: 依赖资源管理器(mysql, redis)支持XA协议, 数据库充当RM角色,应用需要充当TM的角色,即生成全局的txId,调用XAResource接口,把多个本地事务协调为全局统一的分布式事务, 所有结点要么全做要么全不做。 1.2 特点: 需要依赖资源管理器RM(数据库)对XA的支持。 整个处理过程需要锁住事务资源,性能比较低。 场景一: 1)协调者节点向所有参与者节点发出”正式提交(commit)”的请求。 2)参与者节点正式完成操作,并释放在整个事务期间内占用的资源。 3)参与者节点向协调者节点发送”完成”消息。 4)协调者节点受到所有参与者节点反馈的”完成”消息后,完成事务。 场景二: 1)协调者节点向所有参与者节点发出”回滚操作(rollback)”的请求。 2)参与者节点利用之前写入的Undo信息执行回滚,并释放在整个事务期间内占用的资源。 3)参与者节点向协调者节点发送”回滚完成”消息。 4)协调者节点受到所有参与者节点反馈的”回滚完成”消息后,取消事务。 2. TCC模式 2.1介绍 2PC的另类实现,TCC事务机制相对于传统事务机制(X/Open XA Two-Phase-Commit),其特征在于它不依赖资源管理器(RM)对XA的支持,而是通过对业务逻辑的调度来实现分布式事务,

Spring注解 - TX 声明式事务

蓝咒 提交于 2020-03-21 20:11:25
环境搭建 导入maven依赖 <!--spring提供的数据库操作工具--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.0.2.RELEASE</version> </dependency> <!--c3p0 数据库连接池--> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.5</version> </dependency> <!--mysql连接器--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.48</version> </dependency> 配置数据库相关信息 @Configuration @ComponentScan("com.spring.tx") public class TxConfig { /** * 配置数据源 */ @Bean public DataSource dataSource() throws

面试总结——数据库篇

旧街凉风 提交于 2020-03-21 07:30:03
前言:前面介绍了Java、JVM相关方面的题目,该篇介绍数据库方面相关的题目,这里数据库为MySql,因为笔者或朋友在面试过程中都是涉及MySql的相关知识点。 数据库篇 在数据库题目中,由于现在大部分公司都是使用MySql作为数据库,因此笔者及其朋友所遇到的问题也都是MySql相关的知识点。 1)MySql中索引的基本定义,优劣势,以及索引优化。 索引是帮助Mysql高效获取数据的 数据结构 ,因此,索引的 本质 就是数据结构,索引的目的在于提高 查询 效率,可类比字典。 索引: 排好序的快速查找的数据结构。 用途: 排序 + 快速查找 。注意,是两种功能。 数据库除了存储数据本身之外,还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这种 数据结构 就是索引。 MySql索引通常是指 B+树 索引。 索引优势: 类似书籍的目录,提高数据检索的效率,降低数据库的 IO 成本(因为数据最终是存储在 磁盘 上的)。 通过索引列对数据进行排序,降低数据排序的成本,降低了 CPU 的消耗(因为排好序,查询速度增加)。 索引劣势: 索引也是 一张表 ,保存了主键与索引字段,并指向实体表的记录,所以索引列也是要 占用磁盘空间的 。 虽然提高了 查询速度 ,但是会 降低更新速度(因为数据更新后,需要重新对索引排序) ,如

了解Redis

 ̄綄美尐妖づ 提交于 2020-03-21 03:12:56
一. 数据结构 1. value对象的通用结构 typedef struct redisObject { type:4; // 结构化类型 encoding:4; // 这些结构化类型具体的实现方式,同一个类型可以有多种实现 lru:REDIS_LRU_BITS; // 对象的空转时长,用于有限内存下长久不访问的对象的清理 int refcount; // 应用技术,用于对象的清理 void *ptr; // 指向实际承载地址 } 2.常用类型 String:字节串;整数;浮点数; List:列表对象,用于存储String序列;内部以linkedlist或ziplist来承载; Map:内部以hashtable或ziplist来承载;map内部的key和value不能再嵌套map,只能是String; Set:内部以inset或hashtable来承载;一个无序集合,元素不重复; Sorted-Set:内部以ziplist或skiplist+hashtable来承载;有序的key-value对,key不重复,value为浮点数,按照value排序; 二. 客户端与服务器交互 1. 交互协议分为两部分:网络模型和序列化协议; 2. 网络模型:redis协议位于TCP层之上,即客户端和redis实例保持双工的连接,服务器端为每个客户端建立对应的连接; 3. 序列化协议:

Java中DAO的实现

时光怂恿深爱的人放手 提交于 2020-03-21 01:20:12
J2EE 开发人员使用数据访问对象(Data Access Object DAO)设计模式,以便将低级别的数据访问逻辑与高级别的业务逻辑分离。实现 DAO 模式涉及比编写数据访问代码更多的内容。在本文中,Java 开发人员 Sean C. Sullivan 讨论了 DAO 编程中三个常常被忽略的方面:事务界定、异常处理和日志记录。 图 1 显示了应用程序和数据源之间的关系: 图 1. 应用程序和数据源 在整个应用程序中使用数据访问对象(DAO)使我们可以将底层数据访问逻辑与业务逻辑分离开来。我们构建了为每一个数据源提供 CRUD (创建、读取、更新、删除)操作的 DAO 类。 在本文中,我将为您介绍构建更好的 DAO 类的 DAO 实现策略和技术。更确切地说,我将讨论日志、异常处理和事务界定。您将学到如何将这三者结合到自己的 DAO 类中。本文假定您熟悉 JDBC API、SQL 和关系数据库编程。 我们将以对 DAO 设计模式和数据访问对象的概述开始。 DAO基础 DAO 模式是标准 J2EE 设计模式之一。开发人员用这种模式将底层数据访问操作与高层业务逻辑分离开。一个典型的 DAO 实现有以下组件: 一个 DAO 工厂类 一个 DAO 接口 一个实现了 DAO 接口的具体类 数据传输对象(有时称为值对象) 具体的 DAO 类包含访问特定数据源的数据的逻辑

数据库-并发访问带来的问题

安稳与你 提交于 2020-03-20 21:17:32
数据库是一个共享的数据资源。为了提高使用效率,数据库基本上都是多用户的,即允许多个用户并发地访问数据库中的数据,如飞机订票数据库系统、银行储蓄数据库系统等。在这样的系统中,同一时刻并行运行的事务可多达数百个。如果对这种并发访问不加以控制,就会破坏数据的一致性,出现丢失修改、脏读和不可重复读这些问题,如图20.1所示。 丢失修改 脏读 不可重复读 T1 T2 T1 T2 T1 T2 读A=16 读A=16 做A=A-4 写回A=12 读A=16 读A=16 读A=12 读A=16 做A=A-2 写回A=14 做A=A-3 写回A=13 撤销 读A=14 做A=A-1 写回A=15 (数据库中最后为15) (A恢复为16) (A为12,与数据库中的16不相同) 图20.1 并发访问带来的3个问题 一、丢失修改(lost update) 两个事务T1和T2读入同一个数据,并修改,T2提交的修改结果覆盖了T1提交的修改结果,导致T1的修改结果丢失。 例如,如图20.1所示,考虑飞机订票系统中的一个操作序列: 1) 甲售票点(T1事务)读出某航班的机票余额A,此时为16张。 2) 乙售票点(T2事务)读出同一航班的机票余额A,此时也为16张。 3) 甲售票点卖出3张机票,将机票余额A修改成13张,写回数据库。 4) 乙售票点卖出1张机票,将机票余额A修改成15张,写回数据库。 实际上甲

3 月,跳不动了?

拜拜、爱过 提交于 2020-03-20 18:33:26
3 月,跳不动了?>>> 3 月起,许多互联网公司都已经陆陆续续宣布复工。很多想冲击高薪的朋友都开始了跳槽计划。昨天,一位读者留言提到跳槽的事情,说自己在国企工作,绩效一般般,加不动班,技术水平也一般,考虑跳槽,担心跳不动了,还调侃说自己比上不足比下有余。 这里谈谈我的看法—— 不要给自己设立舒适区,要有危机感 。如果现在的工作,让自己感到瞎忙或者无所事事,我建议跳槽。不管是遇到更契合的老板,更有发展的行业,或是单纯涨点钱,都比原地不动强。金三银四,正值跳槽、冲击高薪的时期,对照岗位需求,用心准备面试才能抢占先机。 这里把去年秋招季 阿里、字节跳动、腾讯、美团 等一线互联网公司的 N 套面试题,梳理成了一份大而全的知识图谱,将面试中涉及到的知识点分类汇总了下。 希望能帮助到大家。 由于篇幅有限,这里不能展示出所有的 知识分枝+细分脉络 ,仅以图片的形式给大家展示一部分(完整高清大图文末扫码获取) 。这份资料尤其适合: 1.近期想跳槽,需要面试的程序员,以便查漏补缺,尽快弥补短板; 2.想了解 “一线大厂” 最新技术要求,对比找出自身的长处和弱点所在,评估自己在现有市场上的竞争力如何; 3.尚未形成系统的 Java 知识体系,缺乏清晰的提升方向和学习路径的朋友。 高清大图,文末获取,建议下载到电脑上查看。 除面试资料外,分享一位 高级架构师 朋友近期新录制的 “ 分布式事务 ”