事务管理

MySQL的事务隔离

a 夏天 提交于 2019-12-11 01:04:34
提到事务,你肯定会想到ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性),今天我们就来说说其中I,也就是“隔离性”。 数据库上有多种事务同时执行的话,可能出现脏读,不可重复读,幻读. 幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样. 一般解决幻读的方法是增加范围锁RangeS,锁定检索范围为只读,这样就避免了幻读。 SQL标准的事务隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable )。 读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。 读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。 可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。 串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”

【分布式事务】ACID/BASE/CAP + TCC/2PC/Soga/....

旧巷老猫 提交于 2019-12-10 23:32:17
事务的具体定义 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元,组成事务的所有操作只有在所有操作均能正常执行的情况下方能提交,只要其中任一操作执行失败,都将导致整个事务的回滚。简单地说,事务提供一种“要么什么都不做,要么做全套(All or Nothing)”机制。 数据库本地事务 ACID 数据库事务中的四大特性,ACID: A:原子性(Atomicity) 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 就像你买东西要么交钱收货一起都执行,要么要是发不出货,就退钱。 C:一致性(Consistency) 事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。 I:隔离性(Isolation) 指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态

mysql(一)事务管理

邮差的信 提交于 2019-12-10 21:20:37
事务管理 mysql默认事务管理级别 Oracle默认事务管理级别 名词解释 mysql默认事务管理级别 mysql默认的事务处理级别是’REPEATABLE-READ’,也就是可重复读 1.查看当前会话隔离级别 select @@tx_isolation; 2.查看系统当前隔离级别 select @@global.tx_isolation; 3.设置当前会话隔离级别 set session transaction isolatin level repeatable read; 4.设置系统当前隔离级别 set global transaction isolation level repeatable read; Oracle默认事务管理级别 oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。 默认系统事务隔离级别是READ COMMITTED,也就是读已提交 名词解释 1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据 2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。 3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录

jee第5章 --- Spring的事务管理

六眼飞鱼酱① 提交于 2019-12-10 11:11:30
目录 5.1 Spring事务管理概述 什么是Spring的事务管理 5.1.1 事务管理的核心接口(PlatformTransactionManager接口) 5.1.2 事务管理的方式 5.2 声明式事务管理 如何实现Spring的声明式事务管理 5.2.1 基于XML方式的声明式事务 5.2.2 基于Annotation方式的声明式事务 5.1 Spring事务管理概述 什么是Spring的事务管理 在实际开发中, 操作数据库时都会涉及到事务管理问题 ,为此Spring提供了专门用于事务处理的API。 Spring的事务管理简化了传统的事务管理流程,减少了开发者的工作量 。 5.1.1 事务管理的核心接口(PlatformTransactionManager接口) JAR包 spring-tx-4.3.6.RELEASE(Spring提供的用于事务管理的依赖包) JAR包下的org.springframework.transaction包的三个接口文件 PlatformTransactionManager TransactionDefinition TransactionStatus 关于 PlatformTransactionManager接口 ,Spring提供的平台事务管理器,它提供了操作事务的三个方法: TransactionStatus getTransaction

H2介绍 – Java嵌入式数据库

丶灬走出姿态 提交于 2019-12-09 19:59:04
H2是一个用Java开发的嵌入式数据库,这里指的嵌入式不是手持设备之类的,而是H2数据库作为一个类库,直接嵌入到上层的应用程序中,与应用运行在同一个进程中。 最大的优势在于可以同应用程序打包在一起发布,对于客户端应用来说,非常方便。比如说腾讯QQ或者Mozilla Firefox,用户不可能为了用个软件还得在自己机器上装个MySQL?SQL Server?上述软件就使用嵌入式数据库SQLite来进行客户端本地存储。H2的定位和SQLite一样,属于嵌入式数据库。(H2也可以用在Android上哦) 另一个优势是,写代码时需要写单元测试,与数据库操作相关的功能单元测试都比较不好做,因为有一个环境的问题,而采用H2来进行就要比MySQL要方便的多,首先是启动速度快,而且可以关闭持久化功能,表只存在内存中,每一个用例执行完自动还原到纯净环境。 现在很多开源产品的发布版中所附的测试用例,都是用的H2,目前大家都是把它用作测试。我感觉它的另一个用处是作为内存缓存,NoSQL的一个补充,当某些场景下数据模型必须为关系型,可以拿它当Memcached使,作为后端MySQL/Oracle的一个缓冲层,缓存一些不经常变化但需要频繁访问的数据,比如字典表、权限表。 H2使用非常简单,使用URL: jdbc:h2:~/test 来建立JDBC连接,就会自动创建一个test.h2.db文件和一个test

PostgreSQL Autovacuum和vacuum

怎甘沉沦 提交于 2019-12-09 16:07:31
1 基础知识 重点: 如果您的数据库运行了很久,并且从来没有打开过autovacuum,那么请在打开autovacuum之前全库手动运行vacuum analyze(可能要非常久的时间) 完全禁用autovacuum,请不要这样做,除非你真的知道你在做什么,并且需要定期清理脚本.否则当问题发生时你将不得不处理花费大量的时间处理,甚至可能需要停库、停机 1.1 dead tuples tuple:元组,也就是一行数据   首先,简要解释什么是"死元组"和"膨胀".   当您在PostgreSQL中执行DELETE时,行不会立即从数据文件中删除.而是仅通过在页头中设置xmax字段将其标记为已删除.同样对于UPDATE,它可能在PostgreSQL中被视为DELETE+INSERT.   这是PostgreSQL MVCC背后的基本思想之一,因为它允许更大并发,在不同的进程之间最小的锁定.这个MVCC实现的缺点是留下了已删除的元组,即使在所有可能看到这些版本的事务完成之后也是如此.   如果没有清理,那些"死元组"(对于任何事务实际上是不可见的)将永远留在数据文件中.对于DELETE和UPDATE比较多的的表,死元组可能占据很多磁盘空间.同时,死元组也将从索引中引用,进一步增加了浪费的磁盘空间量.这就是我们在PostgreSQL中称之为“膨胀”的东西,同时因为查询也会变慢。 select

LCN分布式事务框架原理详解4.0

蹲街弑〆低调 提交于 2019-12-08 14:35:21
目录 一、首先介绍3.0与4.0之前的差异 1.、地址: 2、4.0添加升级如下功能: 二、LCN4.0原理 1、架构介绍 2、核心步骤(LCN核心的三步骤) 3、事务协调机制 对于代理连接池的优化 4、补偿机制 为什么需要事务补偿? 补偿机制的触发条件? 补偿事务机制? LCN是怎么去实现事务补偿呢? 5、插件机制 拟场景演示模 一、首先介绍3.0与4.0之前的差异 1.、地址: 2、4.0添加升级如下功能: (1)3.0虽然有事务补偿机制,但4.0在此基础上不仅添加事务补偿机制的策性,还添加了管理的后台可以看到补偿的数据;同时也添加了一个回调地址,可以在补偿之前可以最先知道这次补偿的数据,也可以为我们的框架使用者提供一个决策权。 (2)同4.0时添加的插件扩展机制,也就是说他更加开放了,他可以可以容纳更多的rpc框架,也可以更多的支持db框架,比如mongodb、redis,还有将来一些框架,如ES等等。 二、LCN4.0原理 1、架构介绍 有图可得,lcn是通过nginx作为负载均衡的转发,也就是作为Txmanager的负载均衡的一个转发服务器;然后再是我们的TxManager,也就是事务管理器,然后事务管理器依赖两个服务,一个是redis服务,一个是Eureka服务集群;Eureka集群是用于我们TxManager之间的相互服务发现

LCN分布式事务解决方案

。_饼干妹妹 提交于 2019-12-08 14:34:24
一、什么是分布式事务? 二、lcn的实现思路 Lcn 的本质就是提供了一个全局的事务管理器 本地事务的提交还是回滚,由全局的事务管理器决定 2.1 本地执行的状态怎么提交给全局事务? 使用切面拦截本地事务的执行结果,使用tcp 发送给tx-manager 2.2 本地事务的提交或回滚怎么实现? 等待tx-manager通知自己 三、lcn的使用 3.1 下载lcn-manager (全局的事务管理器) 3.2 配置lcn-manager 配置eureka 并且配置redis Redis: 3.3 启动lcn 3.4 模拟转账服务 数据库: 3.4.1 add-service 3.4.2 decr-service 3.5 2 个微服务都需要添加依赖 < dependency > < groupId > org.springframework.boot </ groupId > < artifactId > spring-boot-starter-actuator </ artifactId > </ dependency > < dependency > < groupId > com.codingapi </ groupId > < artifactId > transaction-springcloud </ artifactId > < version > ${lcn.last

AOP实现LCN分布式事务手动回滚

半城伤御伤魂 提交于 2019-12-08 14:34:04
由于项目用了较为完善的异常处理机制,导致微服务在抛出异常时,立即被@ExpectionHandler捕捉掉了,造成LCN分布式事务无法捕捉到异常而无法回滚的情况。在查看LCN原理的时候,偶然发现可以获取LCN管理事务的事务组代号groupId,由此想到能不能通过这个ID来手动回滚达到目的。 原理 1. 在被调用服务异常抛出后,ExceptionHandler进行捕捉并会返回这些错误信息给被服务调用者,如果微服务调用成功,信息中错误码等于10000,如果不成功,那么错误码是不会等于10000的。那么在服务调用者将这些信息return之后,可以用aop来判断信息是否等于10000,如果不等于,拿到事务组groupId进行手动回滚。 2.如果获取LCN的groupId?LCN源码里有一个 MQTxManagerService 直接注入它: @Autowired MQTxManagerService mqTxManagerService; 然后TxTransactionLocal.current().getGroupId()拿到groupId,向tx-manager发送关闭事务的请求。 @AfterReturning(value = "firstPointCut()",returning = "result") public void rollback(JoinPoint

Hibernate使用笔记整理

非 Y 不嫁゛ 提交于 2019-12-08 05:28:43
A. Hibernate执行环境配置 用到的包 antlr-2.7.6.jar 解释hibernate的查询语言,叫hibernate query Language,叫hql语句的 commons-collections-3.1.jar 是一些集合,一些公共的集合,apache 的 公共包, 主要是支持hibernate缓存的,hibernate有各种缓存,一级缓存,二级缓存,查询缓存 dom4j-1.6.1.jar 解析xml文件的 hibernate3.jar 核心包 javassist-3.11.0.GA.jar 生成一些动态代理的包 jta-1.1.jar java事物管理,事物分布式管理 log4j-1.2.17.jar slf4j-api-1.5.8.jar jpos的日志接口,jpos是自己的产品,一般用的并不多,用的几乎都是log4j,为什么hibernate用它?可能是gemkey被jpos收编了之后,换本家了总得用点自己的东西,3.5以下需要 slf4j-log4j12-1.5.8.jar slf4j-api的实现类,没有实现完的 类路径下的log4j.properties log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out