spring事务管理

简说Spring的事务机制和Spring是如何管理事务的

人盡茶涼 提交于 2020-04-06 05:30:47
事务管理可以帮助我们保证数据的一致性 一 Spring事务机制 编程式事务管理 : Spring推荐使用TransactionTemplate,但是实际开发时我们使用 较多的还是声明式事务较多. 声明式事务管理 : 将我们从复杂的业务管理中解脱出来,获取连接、关闭连接、事务提交、回滚、 异常处理等这些操作都不用我们处理了,Spring都会帮我们处理. 声明式事务管理我们使用了AOP面向切面编程实现,本质上就是我们在目标方法执行前后进行 拦截,在目标方法执行前加入或创建一个事务,在执行方法执行后,根据实际情况选择提交或回滚事务,从而 达到增强方法的目的. 二 Spring是如何来管理事务的? 首先我们要知道Spring事务管理主要包括3个接口,Spring的事务主要是由他们三个共同完成的. 1)PlatformTransactionmanger :事务管理器 主要是用于平台相关事务的管理 主要有3个方法 : 1. commit 提交 : 用来提交我们的事务 2. rollback 回滚 : 当事务出错时可以进行回滚 3.getTransaction : 获取事务的状态 2)TransactionDefinition:事务定义信息--用来定义事务相关的属性,给事务管理器PlatformTransactionManager使用 这个接口有下面四个主要方法:

使用Spring管理数据库事务

守給你的承諾、 提交于 2020-04-06 03:31:10
在整个JavaWeb项目开发中,事务是用来开发可靠性网络应用程序的最关键部分。当应用程序与后端资源进行交互时,就会用到事务,这里的后端资源包括数据库、MQ、ERP等。而数据库事务是最常见的类型,而我们常说的事务也就是狭义上的与关系型数据库交互的事务。 事务主要分为本地事务和全局事务。全局事务又称分布式事务,本地事务就是当应用程序连接单个数据库资源时的事务,也是本文化主要讨论的内容。 一、事务的一些基本概念 事务的属性(ACID): 原子性 一致性 隔离性 持久性 白话“事务” 事务有三个状态(或者说是过程): 开始、提交、回滚 。 假设有这么一个场景:张三和李四各有100元,有一天,张三要给李四转10元。 相当于目前的微信转账,张三给李四发了10元的转账。有以下三种状态 上边这个例子有一处不恰当的地方就是,就算李四没有操作这10元时,张三已经少了10元,这一点和事务有出入 ,我们就假装如果李四不接收或者退回这10元,张三的微信钱包里还有100元。但是在微信中有那么多的人相互转账,每一次转账就是一个事务,我们就要把这些事务进行隔离,但是它有不同的隔离级别(见下) 事务的隔离级别 隔离级别 描述 举例 DEFAULT 底层数据库存储的默认隔离级别 READ_UNCOMMITTED 最低的隔离级别,可以说它并不是事务,因为它允许其他事务来读取未来提交的数据 上边的例子中

【Java系列002】正确使用@Transactional注解

[亡魂溺海] 提交于 2020-04-05 17:42:43
你好,我是miniluo,今天我和你聊聊Spring声明式事务不生效的坑。 下面就让我和你一起学习有哪些几种情况下Spring声明式事务不生效的坑。 没有正确理解@Transactional注解 你是否曾经写过和下文类似的代码? @Service ( "productService" ) public class ProductServiceImpl implements IProductService { @Override public void createProduct (Product product) { //此处可能会实现一些业务逻辑代码,判断是否满足创建产品的条件 //请求内部方法创建产品 product.setProductName( "Spring声明式事务" ); executeCreateProduct(product); } @Transactional private void executeCreateProduct (Product product) { if (Objects.isNull(product)){ throw new RuntimeException( "无法创建空产品" ); } product.create(); //模拟出现异常期待事务回滚 int zero = 1 / 0 ; } } 经过测试,我们发现抛出了异常

Spring+iBatis+Atomikos实现JTA事务

江枫思渺然 提交于 2020-03-30 14:03:54
Atomikos分两个:一个是开源的TransactionEssentials,一个是商业的ExtremeTransactions。 TransactionEssentials的主要特征:JTA/XA 事务管理 —— 提供事务管理和连接池不需要应用服务器 —— TransactionEssentials可以在任何Java EE应用服务器中运行,也就是不依赖于任何应用服务器开源 —— TransactionEssentials是遵守Apache版本2许可的开源软件专注于JDBC/JMS —— 支持所有XA资源,但是资源池和消息监听是专供JDBC和JMS的与Spring 和 Hibernate 集成 —— 提供了描述如何与Spring和Hibernate集成的文档 一、环境 spring 2 ibatis2 AtomikosTransactionsEssentials-3.7.0 下载地址:http://www.atomikos.com/Main/InstallingTransactionsEssentials MySQL-5.1 : 数据库引擎为InnoDB,只有这样才能支持事务 JDK1.6 Oracle10 二 jar包 Atomikos jar必须包 transactions-jdbc.jar transactions-jta.jar transactions.jar

Spring事务隔离 && 事务传播

半腔热情 提交于 2020-03-30 13:59:57
事务的四个属性: 1:原子性( Atomic ) 最重要的原则,也是最容易理解的原则。被事务管理的所有方法,要么一起被提交,要么一起回滚。 2:一致性( Consistency ) 事务在系统完整性中实施一致性,如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于新 有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。 3:隔离性( Isolation ) 在处理一个事务的时候,如果有一个事务同时处理,必须等待这个事务处理完毕,才能进行下一次 处理。 4:持久性( Durability ) 持久性意味着一旦事务执行成功,在系统中产生的所有变化将是永久的。应该存在一些检查点防止在系统 失败时丢失信息。甚至硬件本身失败,系统的状态仍能通过在日志中记录事务完成的任务进行重建。举例:在执行事务的时候,突然停电,等再来电的时候,有个事务记录通知重新执行下这个事务 。 并发问题: 脏读:(一个事务读取了未提交的事务)指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。 不可重复读:(同一个事务中多次读取同一个数据返回的结果不同 )指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改

Spring事务管理--[基于XML的配置]

一曲冷凌霜 提交于 2020-03-30 00:21:28
我觉得自己写的不好,所以先贴一个写的好的帖子 感觉看完不用回来了。。。。 这是一个大佬写的的博客 : https://www.cnblogs.com/yixianyixian/p/8372832.html 第一:JavaEE 体系进行分层开发,事务处理位于业务层,Spring 提供了分层设计 业务层 的事务处理解决方 案。 第二:spring 框架为我们提供了一组事务控制的接口。具体在后面的第二小节介绍。这组接口是在 spring-tx-5.0.2.RELEASE.jar 中。 第三:spring 的事务控制都是基于 AOP 的,它既可以使用编程的方式实现,也可以使用配置的方式实现。我 们学习的重点是使用配置的方式实现。 API 介绍 PlatformTransationManager Spring提供了一个事务管理器接口 PlatformTransationManager ,该接口包含了三个方法: getTransation()//提交事务 commit();//提交事务 rollback();//回滚事务 在开发中,根据应用的技术不同,使用不同的实现类 SpringJDBC / iBatis:org.springframework.jdbc.datasource. DataSourceTransactionManager Hibernate:org

SqlSessionTemplate探究

久未见 提交于 2020-03-26 17:42:40
3 月,跳不动了?>>> 问题就是:无论是多个dao使用一个SqlSessionTemplate,还是一个dao使用一个SqlSessionTemplate,SqlSessionTemplate都是对应一个sqlSession,当多个web线程调用同一个dao时,它们使用的是同一个SqlSessionTemplate,也就是同一个SqlSession,如何保证线程安全,关键就在于代理: (1)首先,通过如下代码创建代理类,表示创建SqlSessionFactory的代理类的实例,该代理类实现SqlSession接口,定义了方法拦截器,如果调用代理类实例中实现SqlSession接口定义的方法,该调用则被导向SqlSessionInterceptor的invoke方法 this .sqlSessionProxy = (SqlSession) newProxyInstance( SqlSessionFactory. class .getClassLoader(), new Class[] { SqlSession. class }, new SqlSessionInterceptor()); (2)所以关键之处转移到invoke方法中,代码如下,该类的注释是代理将Mybatis的方法调用导向从Spring的事务管理器获取的合适的SqlSession

69道必考spring面试题

旧时模样 提交于 2020-03-24 18:49:40
目录 Spring 概述 依赖注入 Spring beans Spring注解 Spring数据访问 Spring面向切面编程(AOP) Spring MVC Spring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。 2. 使用Spring框架的好处是什么? 轻量:Spring 是轻量的,基本的版本大约2MB。 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。 面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。 容器:Spring 包含并管理应用中对象的生命周期和配置。 MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。 事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。 异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。 3.

事物隔离级别与传播特性

北城以北 提交于 2020-03-23 12:12:06
Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要我们在与事务相关的方法中处理大量的try…catch…finally代码。 我们在使用Spring声明式事务时,有一个非常重要的概念就是事务属性。事务属性通常由事务的传播行为,事务的隔离级别,事务的超时值和事务只读标志组成。我们在进行事务划分时,需要进行事务定义,也就是配置事务的属性。 Spring在 TransactionDefinition 接口中定义这些属性,以供PlatfromTransactionManager使用, PlatfromTransactionManager是spring事务管理的核心接口。 Java代码 TransactionDefinition public interface TransactionDefinition { int getPropagationBehavior(); int getIsolationLevel(); int getTimeout(); boolean isReadOnly(); } getTimeout()方法,它返回事务必须在多少秒内完成。 isReadOnly(),事务是否只读,事务管理器能够根据这个返回值进行优化,确保事务是只读的。 getIsolationLevel(

事务补偿

会有一股神秘感。 提交于 2020-03-23 10:43:25
99% 的人都能看懂的「补偿」以及最佳实践 也许你对降级已经有了一些认识,这次,我们来聊一聊在保证对外高可用的同时,憋出的“内伤”该如何通过「补偿」机制来自行消化。 「补偿」机制的意义 以电商的购物场景为例: 客户端 ----> 购物车微服务 ----> 订单微服务 ----> 支付微服务。 这种调用链非常普遍。 那么为什么需要考虑补偿机制呢? 正如之前几篇文章所说,一次跨机器的通信可能会经过 DNS 服务,网卡、交换机、路由器、负载均衡等设备,这些设备都不一定是一直稳定的,在数据传输的整个过程中,只要任意一个环节出错,都会导致问题的产生。 而在分布式场景中,一个完整的业务又是由多次跨机器通信组成的,所以产生问题的概率成倍数增加。 但是,这些问题并不完全代表真正的系统无法处理请求,所以我们应当尽可能的自动消化掉这些异常。 可能你会问,之前也看到过「补偿」和「事务补偿」或者「重试」,它们之间的关系是什么? 你其实可以不用太纠结这些名字,从目的来说都是一样的。就是一旦某个操作发生了异常,如何通过内部机制将这个异常产生的「不一致」状态消除掉。 题外话:在笔者看来,不管用什么方式,只要通过额外的方式解决了问题都可以理解为是「补偿」,所以「事务补偿」和「重试」都是「补偿」的子集。前者是一个逆向操作,而后者则是一个正向操作。 只是从结果来看,两者的意义不同。「事务补偿」意味着“放弃”