事务

分布式事务简介

心不动则不痛 提交于 2020-02-25 19:35:03
分布式事务用一句话来说就是在并发的环境下如何解决数据一致性的问题 1.XA协议下的两段式提交 XA协议-> 资源管理器(DB)与事务管理器的接口标准, 在xa协议下,提交一个事务需要两个阶段 阶段一:预备提交 阶段二:提交 基于xa协议的进阶版 tcc 每次提交之前先执行try接口测试数据库是否是通的,数据库都是通的之后再去进行提交操作 需要在业务层实现try confirm接口 基于消息的,采取最终一致性策略的分布式事务(消息队列---->MQ) 在一个事务正在进行的同时,发出消息给其他的业务,如果发送消息失败,或者 消息的执行失败,则回滚消息,重复执行,反复执行失败后,记录失败信息,后期补充性的处理. 在消息系统中开启事务,消息的事务是指,保证消息被正常消费,否则回滚的一种机制, 来源: CSDN 作者: 戴** 链接: https://blog.csdn.net/qq_39992641/article/details/104500901

MySQL 事务提交过程

本小妞迷上赌 提交于 2020-02-25 11:43:26
开发老大要求通过binlog查询一条被修改的数据,数据被查出后问我,有没有可能binlog中不会记录,回答不会,因为数据被修改,若失败直接回滚,不会在binlog中记录,此刻一个朋友用了洪荒之力告诉我,失败的话也会记录,坐地无语,因为他sqlserver dba,用sqlserver的思维考虑mysql,哈哈哈哈哈,用实验让他闭嘴! 简单测试步骤如下: root(yoon)> flush logs; Query OK, 0 rows affected (0.01 sec) root((none))> show binlog events in 'mysql-bin.000041'; +------------------+-----+-------------+-----------+-------------+---------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+-------------+-----------+-------------+---------------------------------------+ | mysql-bin.000041 | 4 |

mysql源码解读之事务提交过程(一)

∥☆過路亽.° 提交于 2020-02-25 11:43:11
mysql是一种关系型数据库,关系型数据库一个重要的特性就是支持事务,这是区别于no-sql产品的一个核心特性。当然了,no-sql产品支持键值查询,不能支持sql语句,这也是一个区别。今天主要讨论下事务的提交流程,由于mysql插件式存储架构,导致开启binlog后,事务提交实质是二阶段提交,通过两阶段提交,来保证存储引擎和二进制日志的一致。本文仅讨论binlog未打卡状态下的提交流程,后续会讨论打开binlog选项后的提交逻辑。源码调试环境如下: 测试环境: OS:windows DB:mysql 5.6.12 engine:innodb 测试前置条件: set autocommit=0; create table tt(col1 int, col2 varchar(100)); 测试语句: insert into tt values(1, 'abcdef'); commit; 无论对于dml语句【insert,update,delete等】还是dcl语句【commit,rollback】,mysql提供了公共接口mysql_execute_command,我们先分析mysql_execute_command接口的基本流程: mysql_execute_command { switch (command) { case SQLCOM_INSERT: mysql_insert()

hibernate一级缓存和二级缓存的区别

空扰寡人 提交于 2020-02-25 01:49:10
缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。   缓存的介质一般是内存,所以读写速度很快。但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质。缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期。   Hibernate的缓存包括Session的缓存和SessionFactory的缓存,其中SessionFactory的缓存又可以分为两类:内置缓存和外置缓存。Session的缓存是内置的,不能被卸载,也被称为Hibernate的第一级缓存。SessionFactory的内置缓存和Session的缓存在实现方式上比较相似,前者是SessionFactory对象的一些集合属性包含的数据,后者是指Session的一些集合属性包含的数据。SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的拷贝,而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来,SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义SQL语句

Hibernate学习之Hibernate一级缓存和二级缓存

百般思念 提交于 2020-02-25 01:48:25
一级缓存和二级缓存 缓存概念   缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。   Hibernate的缓存包括 Session的缓存和SessionFactory的缓存 ,其中SessionFactory缓存又可以分为两类:内置缓存和外置缓存。 Session缓存是内置的,不能被卸载,也被称为Hibernate的第一级缓存。 SessionFactory 的内置缓存和Session的缓存在实现方式上比较相似,前者是SessionFactory对象的一些集合属性包含的数据,后者是指Session的一 些集合属性包含的数据。SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的拷贝,而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来,SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义SQL语句,因此SessionFactory不需要进行内置缓存与映射文件的同步。SessionFactory的外置缓存是一个可配置的插件。在默认情况下,SessionFactory不会启用这个插件

Hibernate一级缓存与二级缓存的区别

半腔热情 提交于 2020-02-25 01:46:25
一级缓存:   就是 Session级别 的缓存。一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中。   如果短时间内这个session(一定要同一个session)又做了同一个操作,那么hibernate直接从一级缓存中拿,而不会再去连数据库,取数据。   它是内置的 事务范围的缓存 , 不能被卸载 。 二级缓存:   就是 SessionFactory级别 的缓存。顾名思义,就是查询的时候会把查询结果缓存到二级缓存中。   如果同一个sessionFactory创建的某个session执行了相同的操作,hibernate就会从二级缓存中拿结果,而不会再去连接数据库。   这是 可选的 插件式的缓存 ,在默认情况下,SessionFactory不会启用这 个插件。    可以在每个类或每个集合的粒度上配置 。 缓存适配器 用于把具体的缓存实现软件与Hibernate集成。 严格意义上说,SessionFactory缓存分为两类:内置缓存和外置缓存。我们通常意义上说的二级缓存是指外置缓存。 内置缓存与session级别缓存实现方式相似。前者是SessionFactory对象的一些集合属性包含的数据,后者是指Session的一些集合属性包含的数据 SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句。   映射元数据是映射文件中数据的拷贝;

Hibernate缓存原理与策略 Hibernate缓存原理:

可紊 提交于 2020-02-25 01:44:55
Hibernate缓存原理 : 对于Hibernate这类ORM而言,缓存显的尤为重要,它是持久层性能提升的关键.简单来讲Hibernate就是对JDBC进行封装,以实现内部状态的管理,OR关系的映射等,但随之带来的就是数据访问效率的降低,和性能的下降,而缓存就是弥补这一缺点的重要方法. 缓存就是数据库数据在内存中的临时容器,包括数据库数据在内存中的临时拷贝,它位于数据库与数据库访问层中间.ORM在查询数据时首先会根据自身的缓存管理策略,在缓存中查找相关数据,如发现所需的数据,则直接将此数据作为结果加以利用,从而避免了数据库调用性能的开销.而相对内存操作而言,数据库调用是一个代价高昂的过程. 一般来讲ORM中的缓存分为以下几类: 1: 事务级缓存 :即在当前事务范围内的数据缓存.就Hibernate来讲,事务级缓存是基于Session的生命周期实现的,每个Session内部会存在一个数据缓存,它随着 Session的创建而存在,随着Session的销毁而灭亡,因此也称为Session Level Cache. 2: 应用级缓存 :即在某个应用中或应用中某个独立数据库访问子集中的共享缓存,此缓存可由多个事务共享(数据库事务或应用事务),事务之间的缓存共享策略与应用的事务隔离机制密切相关.在Hibernate中,应用级缓存由SessionFactory实现

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

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

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

MqSQL事务、锁

戏子无情 提交于 2020-02-23 16:28:51
事务特性(ACID) 原子性 一致性 隔离性 持久性 日志(innodb) redo日志 事务提交后,需要把数据保存到磁盘,如果每次都刷盘,会影响效率。所以将修改行为先写到redo日志中,再定期将日志刷到磁盘中 undo日志 事务未提交时,会将修改前的旧版本存放到undo日志,事务回滚时,利用undo日志,撤销未提交事务对数据的影响。 存储undo的地方就是回滚段 insert操作,undo直接存数据的pk(row_id),回滚直接删除 delete/update,记录旧数据row,回滚直接恢复 隔离性 脏读。事务T1修改某条数据,事务T2读取该值,T1由于某种原因导致回滚,导致T2所读的数据是无效数据。 不可重复读。一个事务范围内,两个相同的查询却返回不同的值。由于在事务范围内,有其它事物修改了数据导致。 幻读。与不可重复读非常类似,指一个事务范围内,两次相同的查询,第二次比第一次少或多数据。 InnoDB四种事务隔离级别实现原理 read uncommitted select语句不加锁,并发最高,一致性最差。 read commotted 普通读是快照读 加锁的select, update, delete等语句,除了在外键约束检查(foreign-key constraint checking)以及重复键检查(duplicate-key checking)时会封锁区间