浅析Spring提供的事务管理方法

合集下载

spring事务配置

spring事务配置

Spring事务配置的五种方法事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。

这样可以防止出现脏数据,防止数据库数据出现问题。

开发中为了避免这种情况一般都会进行事务管理。

在JDBC中是通过Connection对象进行事务管理的,默认是自动提交事务,可以手工将自动提交关闭,通过commit方法进行提交,rollback方法进行回滚,如果不提交,则数据不会真正的插入到数据库中。

Hibernate中是通过Transaction进行事务管理,处理方法与JDBC中类似。

Spring不会直接去管理事务,它提供了很多可供选择的事务管理器,将事务委托给JTA或某些特定的平台事务实现. Spring一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。

针对Spring事务管理总结如下:要想用Spring的事务管理机制,就需要把数据库的连接交给Spring来管理,(JDBC,SESSION道理一样),如果使用Hibernate框架,要把Session交给Spring管理。

在整个Service方法调用中,虽然Sevice调用了多个Dao,但是整个过程中Session只有一个。

也就是说你对数据库的DML操作,都会先保存在这个Session中,包括update,insert,delete。

当发生异常(这个异常可以是数据库的,也可以是程序的),Spring会把这个Session中对应的DML操作回滚。

Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。

DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。

Spring声明式事务详解

Spring声明式事务详解

Spring声明式事务详解Spring 中的事务控制⽅式Spring 的事务控制可以分为编程式事务控制和声明式事务控制编程式开发者直接把事务的代码和业务代码耦合到⼀起,在实际开发中不⽤。

声明式开发者采⽤配置的⽅式来实现的事务控制,业务代码与事务代码实现解耦合,使⽤的API思想。

基于XML的声明式事务控制【重点】在 Spring配置⽂件中声明式的处理事来代替代码式的处理事务。

底层采⽤ AOP 思想来实现的。

声明式事务控制明确事项:核⼼业务代码(⽬标对象)事务增强代码{ Spring已提供事务管理器)切⾯配置步骤分析1.引⼊tx 命名空间2.事务管理器通知配置3.事务管理器AOP配置引⼊依赖坐标<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:aop="/schema/aop"xmlns:tx="/schema/tx"xsi:schemaLocation="/schema/beanshttps:///schema/beans/spring-beans.xsd/schema/contexthttps:///schema/context/spring-context.xsd/schema/aophttps:///schema/aop/spring-aop.xsd/schema/txhttps:///schema/tx/spring-tx.xsd"></beans>基于 XML 的声明式事务的控制配置⽂件<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:aop="/schema/aop"xmlns:tx="/schema/tx"xsi:schemaLocation="/schema/beanshttps:///schema/beans/spring-beans.xsd/schema/contexthttps:///schema/context/spring-context.xsd/schema/aophttps:///schema/aop/spring-aop.xsd/schema/txhttps:///schema/tx/spring-tx.xsd"><!-- 开启 IOC 注解扫描 --><context:component-scan base-package="inly"/><!-- 引⼊ properties ⽂件 --><context:property-placeholder location="classpath:jdbc.properties"/><!-- 配置数据源 --><bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="${jdbc.driverClassName}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${ername}"/><property name="password" value="${jdbc.password}"/></bean><!-- jdbcTemplate --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><!-- 绑定数据源 --><property name="dataSource" ref="datasource"/></bean><!-- 事务管理器对象 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 数据源对象 --><property name="dataSource" ref="datasource"/></bean><!-- 通知增强 transaction-manager: 配置的事务管理器对象 --><tx:advice id="txAdvice" transaction-manager="transactionManager"><!-- 定义⼀些事务属性 --><tx:attributes><!-- * 表⽰当前任意名称的⽅法都⾛默认的配置 --><tx:method name="*"/></tx:attributes></tx:advice><!-- AOP 配置切⾯ --><aop:config><!-- 配置声明式式务 --><aop:advisor advice-ref="txAdvice" pointcut="execution(* erServiceImpl.updateUser(..))"/></aop:config></beans>Service 层@Overridepublic void updateUser() {User user = userDao.find(2);user.setName("li3");userDao.updateUser(user);int i = 1 / 0;user.setAge(13);userDao.updateUser(user);System.out.println(user);}事务参数的配置详解<tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" timeout="-1" read-only="false"/> name:切点⽅法等isolation:事务的隔离级别propogation:事务的传播⾏为timeout:超时时间read-only:是否只读常⽤ CURD 配置<tx:advice id="txAdvice" transaction-manager="transactionManager"><!-- 定义⼀些事务属性 --><tx:attributes><!-- CRUD 常⽤配置表⽰以update开头的⽅法--><tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" timeout="-1"/> <tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" timeout="-1"/><tx:method name="delete*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" timeout="-1"/> <tx:method name="find" read-only="true"/><!-- * 表⽰当前任意名称的⽅法都⾛默认的配置 --><tx:method name="*"/></tx:attributes></tx:advice>基于注解的声明式事务控制常⽤注解步骤分析修改 Service 层,增加事务注解@Override@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.REPEATABLE_READ,readOnly = false,timeout = -1) public void updateUser() {User user = userDao.find(2);user.setName("li3");userDao.updateUser(user);int i = 1 / 0;user.setAge(13);userDao.updateUser(user);System.out.println(user);}修改 Spring 核⼼配置⽂件,开启事务注解⽀持<tx:annotation-driven/>。

spring事务实现原理

spring事务实现原理

spring事务实现原理Spring事务实现原理。

Spring框架是一个轻量级的开源框架,它为企业级应用程序提供了全面的基础设施支持。

其中,事务管理是Spring框架的一个重要特性,它能够帮助我们简化事务管理的复杂性,提高开发效率。

本文将深入探讨Spring事务的实现原理,帮助读者更好地理解Spring框架中事务管理的工作机制。

在Spring框架中,事务管理主要通过两种方式来实现,基于编程的事务管理和基于声明式的事务管理。

基于编程的事务管理是通过编写代码来控制事务的提交和回滚,而基于声明式的事务管理则是通过在配置文件中声明事务的属性来实现。

这两种方式都是基于Spring框架中的事务管理器来实现的。

Spring框架中的事务管理器是一个接口,它定义了事务管理的基本操作,包括事务的开始、提交和回滚。

在实际应用中,我们可以通过配置来指定具体的事务管理器实现,例如DataSourceTransactionManager、HibernateTransactionManager等。

这些事务管理器会根据具体的数据访问技术来管理事务,确保事务的一致性和隔离性。

在Spring框架中,事务管理的核心是通过AOP(面向切面编程)来实现的。

Spring框架利用AOP技术在方法调用前后插入事务管理的逻辑,从而实现了对事务的控制。

通过AOP,Spring框架能够将事务管理的逻辑与业务逻辑分离,使得事务管理变得更加灵活和可维护。

另外,Spring框架还提供了@Transactional注解来简化事务管理的配置。

通过在方法上添加@Transactional注解,我们可以将该方法纳入事务管理的范围之内,从而实现对该方法的事务控制。

这种基于注解的事务管理方式极大地简化了事务管理的配置工作,提高了开发效率。

除了事务管理器和AOP技术,Spring框架还依赖于底层的数据访问技术来实现事务管理。

不同的数据访问技术有着不同的事务管理实现方式,例如JDBC、Hibernate、JPA等。

spring事务

spring事务

在学习spring事务管理时,我忍不住要问,spring为什么进行事务管理,spring怎么进行的事务管理?首先,为什么要进行事务,接下来说说spring是怎样进行事务管理的.Spring事务策略Spring事务策略,也就是spring事务管理的实现方式.它有一个统一的抽象是由实现下面这个接口完成的.org.springframework.transaction.PlatformTransactionManager此接口的内容如下:1. Public interface PlatformTransactionManager()...{2. TransactionStatue getTransaction(TransactionDefinition definition) throws TransactionException;3. Void commit(TransactionStatus status) throws TransactionException;4. Void rollback(TransactionStatus status) throws TransactionException;5. }不管是声明式的还是编程式的事务管理都需要此抽象来完成.解释一下这个接口,这样可以更好的理解spring的事务控制的原理.getTransaction() 根据类型为TransactionDefinition的参数返回一个TransactionStatus对象.返回的TransactionStatus对象可能代表一个新的或已经存在的事务(如果在当前调用堆栈有一个符合条件的事务).如同J2EE事务上下文,一个TransactionStatus也是和执行的线程关联的.同时,在框架中还存在TransactionDefinition接口,即上边的参数类型.此接口指定了事务隔离程度、事务传播、事务超时、只读状态。

Spring事务管理(详解+实例)

Spring事务管理(详解+实例)

1 初步理解理解事务之前,先讲一个你日常生活中最常干的事:取钱。

比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱;然后ATM出1000元钱。

这两个步骤必须是要么都执行要么都不执行。

如果银行卡扣除了1000块但是ATM出钱失败的话,你将会损失1000元;如果银行卡扣钱失败但是ATM却出了1000块,那么银行将损失1000元。

所以,如果一个步骤成功另一个步骤失败对双方都不是好事,如果不管哪一个步骤失败了以后,整个取钱过程都能回滚,也就是完全取消所有操作的话,这对双方都是极好的。

事务就是用来解决类似问题的。

事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。

在企业级应用程序开发中,事务管理必不可少的技术,用来确保数据的完整性和一致性。

事务有四个特性:ACID∙原子性(Atomicity):事务是一个原子操作,由一系列动作组成。

事务的原子性确保动作要么全部完成,要么完全不起作用。

∙一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。

在现实中的数据不应该被破坏。

∙隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。

∙持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。

通常情况下,事务的结果被写到持久化存储器中。

2 核心接口Spring事务管理的实现有许多细节,如果对整个接口框架有个大体了解会非常有利于我们理解事务,下面通过讲解Spring的事务接口来了解Spring实现事务的具体策略。

Spring事务管理涉及的接口的联系如下:2.1 事务管理器Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。

Spring事务配置的五种方式

Spring事务配置的五种方式

Spring事务原理统观spring事务,围绕着两个核心PlatformTransactionManager和TransactionStatusspring提供了几个关于事务处理的类:TransactionDefinition //事务属性定义TranscationStatus //代表了当前的事务,可以提交,回滚。

PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。

一般事务定义步骤:TransactionDefinition td = new TransactionDefinition();TransactionStatus ts = transactionManager.getTransaction(td);try{ //do sthmit(ts);}catch(Exception e){transactionManager.rollback(ts);}spring提供的事务管理可以分为两类:编程式的和声明式的。

编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。

编程式主要使用transactionTemplate。

省略了部分的提交,回滚,一系列的事务对象定义,需注入事务管理对象.void add(){transactionTemplate.execute( new TransactionCallback(){pulic Object doInTransaction(TransactionStatus ts){ //do sth}}}声明式:使用TransactionProxyFactoryBean:<bean id="userManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"><property name="transactionManager"><ref bean="transactionManager"/></property><property name="target"><ref local="userManagerTarget"/></property><property name="transactionAttributes"><props><prop key="insert*">PROPAGATION_REQUIRED</prop><prop key="update*">PROPAGATION_REQUIRED</prop><prop key="*">PROPAGATION_REQUIRED,readOnly</prop></props></property></bean>围绕Poxy的动态代理能够自动的提交和回滚事务org.springframework.transaction.interceptor.TransactionProxyFactoryBeanPROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。

spring 事务 实现原理

spring 事务 实现原理

spring 事务实现原理Spring事务的实现原理主要依赖于数据库或者其他存储系统的事务功能。

1. 数据库事务支持:Spring事务的实现依赖于数据库的事务功能。

通常情况下,数据库支持ACID(原子性、一致性、隔离性和持久性)事务特性,可以通过SQL的BEGIN、COMMIT 和ROLLBACK等命令来控制事务的开始、提交和回滚操作。

2. 事务管理器:Spring框架提供了事务管理器(TransactionManager)接口,用于管理事务的开始、提交和回滚等操作。

事务管理器可以根据配置信息选择不同的实现,如使用JDBC事务管理器(DataSourceTransactionManager)或者JTA事务管理器(JtaTransactionManager)等。

3. 编程式事务:Spring框架提供了编程式事务管理的支持,通过编写代码显式地控制事务的边界。

开发者可以在代码中使用事务管理器的API来手动管理事务,包括事务的开始、提交和回滚等操作。

这种方式灵活性较高,但也需要开发者手动处理事务的细节。

4. 声明式事务:Spring框架还提供了声明式事务管理的支持,通过使用注解或者XML配置来定义事务的属性和边界。

开发者可以使用@Transactional注解或者事务配置元素来标记方法或者类,指示该方法或者类在执行时需要开启事务。

Spring会在方法调用前后自动地管理事务的开始、提交和回滚等操作。

5. 事务传播行为:Spring事务还支持事务传播行为的定义,即一个方法调用另一个带有事务的方法时事务该如何传播。

例如,当前方法可能会暂停事务、加入到现有的事务中或者创建一个新的事务。

Spring提供了多种事务传播行为的选项,如REQUIRED、REQUIRES_NEW、NESTED等,可以根据需要进行配置。

总的来说,Spring事务的实现原理是通过与数据库或其他存储系统的事务功能结合,通过事务管理器来管理事务的开始、提交和回滚等操作。

spring事务原理

spring事务原理

spring事务原理数据库系统内,事务指一系列连续的操作,这系列操作被看作一个整体,要么完全执行,要么完全不执行,不会出现执行部分的情况,这是数据库系统的基本特征之一。

在传统数据库系统中,事务的管理是由数据库系统自身提供的一种功能,然而随着数据库系统的复杂性的增加,数据库中的事务管理越来越复杂,对数据库操作有更多的要求,这样就催生了应用层事务管理技术,而当前最流行的事务管理技术是Spring事务。

Spring事务是一种基于AOP(面向切面编程)的分布式事务管理技术,它能够帮助系统更好的控制事务的处理过程,从而使系统内的数据更加有效率的共享,降低数据库事务的管理复杂度,提高数据库系统的可用性及性能。

Spring事务原理包括几个要素:事务模型、分布式事务处理框架、事务实现机制以及事务管理工具等。

一、事务模型Spring事务原理的核心是事务模型,即它把事务分为两种:提交成功事务和失败事务,在Spring提供的事务模型中,每个事务都只有两种结果,要么提交成功,要么提交失败,而不存在半提交的状态。

在Spring的事务模型中,事务的分类还要求事务的原子性,它要求一旦提交事务,事务就不会再次改变,或者改变的程度会很小。

原子性还表明事务的执行要么完全成功,要么完全失败,不会出现半成功半失败的情况。

二、分布式事务处理框架Spring提供了基于AOP技术的分布式事务处理框架,这种分布式事务处理框架能够有效地支持不同数据库之间的事务处理,它包括三个部分:事务管理器(TransactionManager)、事务拦截器(TransactionInterceptor)和事务事件监听器(TransactionListener)。

事务管理器是Spring对分布式事务的抽象,它可以处理不同类型的事务,它的实现通常会涉及到一些事务拦截器。

事务拦截器是Spring提供的一种安全机制,它能够在事务处理过程中,根据配置的规则,来拦截事务的执行,以便能够在事务处理过程中发现任何可能存在的问题,并对其进行调整,使得事务能够顺利的提交。

简述spring的事物管理原理

简述spring的事物管理原理

简述spring的事物管理原理
Spring的事务管理原理是基于AOP(面向切面编程)和代理模式实现的。

Spring的事务管理实现主要包括以下几个步骤:
1. 配置事务管理器:通过配置需要使用的事务管理器,如DataSourceTransactionManager或JtaTransactionManager,来管理事务。

2. 使用@Transactional注解标记事务方法:在需要进行事务管理的方法上添加@Transactional注解,Spring会通过AOP将该方法进行代理,以实现在方法执行前后进行事务的开启、提交或回滚。

3. 执行代理方法:当调用被@Transactional注解标记的方法时,实际执行的是代理对象的方法。

代理对象会在方法执行前后执行一系列的操作,包括开启事务、执行业务逻辑、提交事务或回滚事务。

4. AOP拦截:Spring使用AOP在代理对象的方法执行前后拦截方法调用,并根据方法上的@Transactional注解来判断是否需要进行事务管理。

5. 事务切面的应用:通过配置事务切面,将被@Transactional注解标记的方法组合为一个切面,然后在需要进行事务管理的地方将切面应用到目标对象上,实现对目标方法的事务管理。

总结起来,Spring的事务管理原理是通过AOP拦截方法调用,代理目标方法,并根据@Transactional注解的配置来进行事务的管理。

这样可以将事务的开启、提交或回滚等操作与业务逻辑解耦,提高代码的重用性和可维护性。

全面分析 Spring 的编程式事务管理及声明式事务管理

全面分析 Spring 的编程式事务管理及声明式事务管理

全面分析 Spring 的编程式事务管理及声明式事务管理摘要Spring 的事务管理是 Spring 框架中一个比较重要的知识点,该知识点本身并不复杂,只是由于其比较灵活,导致初学者很难把握。

本教程从基础知识开始,详细分析了 Spring 事务管理的使用方法,为读者理清思路。

先决条件本教程假定您已经掌握了 Java 基础知识,并对 Spring 有一定了解。

您还需要具备基本的事务管理的知识,比如:事务的定义,隔离级别的概念,等等。

本文将直接使用这些概念而不做详细解释。

另外,您最好掌握数据库的基础知识,虽然这不是必须的。

系统需求要试验这份教程中的工具和示例,硬件配置需求为:至少带有 512MB 内存(推荐 1GB)的系统。

需要安装以下软件:Sun JDK 5.0 或更新版本或 IBM Developer Kit for the Java 5 platform 版本。

Spring framework 2.5。

本教程附带的示例代码已经在 Spring 2.5.6 上测试过。

MySQL 5.0 或更新版本。

Spring 事务属性分析事务管理对于企业应用而言至关重要。

它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性。

就像银行的自助取款机,通常都能正常为客户服务,但是也难免遇到操作过程中机器突然出故障的情况,此时,事务就必须确保出故障前对账户的操作不生效,就像用户刚才完全没有使用过取款机一样,以保证用户和银行的利益都不受损失。

在 Spring 中,事务是通过 TransactionDefinition 接口来定义的。

该接口包含与事务属性有关的方法。

具体如清单1所示:清单1. TransactionDefinition 接口中定义的主要方法public interface TransactionDefinition{int getIsolationLevel();int getPropagationBehavior();int getTimeout();boolean isReadOnly();}也许你会奇怪,为什么接口只提供了获取属性的方法,而没有提供相关设置属性的方法。

spring事务详解(基于注解和声明的两种实现方式)

spring事务详解(基于注解和声明的两种实现方式)

spring事务详解(基于注解和声明的两种实现⽅式)Spring事务( Transaction )事务的概念事务是⼀些sql语句的集合,作为⼀个整体执⾏,⼀起成功或者⼀起失败。

使⽤事务的时机⼀个操作需要多天sql语句⼀起完成才能成功程序中事务在哪⾥说明加在业务类的⽅法上⾯(public⽅法上⾯),表⽰业务⽅法执⾏时,需要事务的⽀持。

不同的事务管理器不同的数据库访问技术,处理事务是不同的1. 使⽤jdbc访问数据库,事务处理public void updateAccount(){Connection con = .....;con.setAutoCommit(false);state.insert();state.update();mit();con.setAutoCommit(true);}2. MyBatis执⾏数据库,处理事务public void updateAccount(){SqlSession sqlSession = SqlSessionFactory.openSession(false);try{sqlSession.insert(...);sqlSession.update(...);mit();}catch(Exception e){sqlSession.rollback();}}spring统⼀管理事务,把不同的数据库访问技术的事务处理统⼀起来使⽤spring的事务管理器,管理不同数据库访问技术的事务处理。

开发⼈员只需要掌握spring的事务处理⼀个⽅案,就可以实现使⽤不同数据库访问技术的事务管理。

尽管事务⾯向的是spring,有spring管理事务,做事务提交和回滚。

spring事务管理器spring框架使⽤事务管理器对象,管理所有的事务。

事务管理器接⼝: PlatFormTransactionManager作⽤:定义了事务的操作,主要是commit() , rollback()事务管理器有很多的实现类:⼀种数据库访问计数有⼀个实现类。

Spring中的事务管理实例详解

Spring中的事务管理实例详解

Spring中的事务管理实例详解本文实例讲述了Spring中的事务管理。

分享给大家供大家参考。

具体分析如下:事务简介:事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性事务就是一系列的动作,它们被当作一个单独的工作单元。

这些动作要么全部完成,要么全部不起作用事务的四个关键属性(ACID)①原子性(atomicity):事务室一个原子操作,有一系列动作组成。

事务的原子性确保动作要么全部完成,要么完全不起作用②一致性(consistency):一旦所有事务动作完成,事务就被提交。

数据和资源就处于一种满足业务规则的一致性状态中③隔离性(isolation):可能有许多事务会同时处理相同的数据,因此每个事物都应该与其他事务隔离开来,防止数据损坏④持久性(durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响。

通常情况下,事务的结果被写到持久化存储器中Spring中的事务管理作为企业级应用程序框架,Spring在不同的事务管理API之上定义了一个抽象层。

而应用程序开发人员不必了解底层的事务管理API,就可以使用Spring的事务管理机制。

Spring既支持编程式事务管理,也支持声明式的事务管理编程式事务管理:将事务管理代码嵌入到业务方法中来控制事务的提交和回滚,在编程式事务中,必须在每个业务操作中包含额外的事务管理代码声明式事务管理:大多数情况下比编程式事务管理更好用。

它将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。

事务管理作为一种横切关注点,可以通过AOP方法模块化。

Spring通过Spring AOP框架支持声明式事务管理。

Spring事务的传播属性:当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。

例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。

事务的传播行为可以由传播属性指定。

Spring定义了7种传播行为:Spring支持的事务传播行为传播行为含义PROPAGATION_MANDATORY 表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常PROPAGATION_NESTED 表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。

spring事务管理

spring事务管理

5事务管理为了描述事务的概念,我们拿买电影票来举例。

买一张电影票通常有一下步骤:检查剩余座位的数量,确定是否能给你提供你需要的座位个数每卖出一张票,可用座位的数量就应该减一付款售票员把票给你如果一切顺利的话,你就可以欣赏到一场一鸣惊人的电影,而影院也增加了收入。

但是如果有环节出差错了怎么办呢?比如说:你用来付款的信用卡没钱了?显然,你不会拿到票,影院也拿不到钱。

但是如果说座位的数量在下个人购买之前没有被恢复到原来的状态,那么电影也许因为人为原因而不会满场了。

或者如果出现这样的情况:一切都很顺利,但是发放票的时候出了问题。

你只好乖乖的呆在家里看电视了,而且还损失了一小笔钱。

为了保证剧院和你都不受到损失,上面的操作应该用事务封装起来。

作为事务,它应该被看成是一个单独的动作,以保证要么所有的操作都成功,或者所有的操作都回滚到初始的状态。

在软件中,事务有着举足轻重的地位,确保数据和资源保持一致的状态。

如果没有事务,那么数据有可能因为应用程序的业务逻辑而变成脏数据,或者变成与其他数据不统一的数据。

让我们快速浏览一下事务向导和他是如何工作的。

有以下四个因素。

5.1.1 用四句话来解释事务在软件开发的一个重要传统里,可以用一个单词首字母的缩写来描述一个事务:ACID,简言之,ACID代表Atomic(原子性)事务由一个或多个动作绑定起来作为一个单独的工作单元。

原子性保证事务中所有的操作要么都执行,或者都不执行。

如果所有的动作都执行了,那么事务就是成功的,如果其中有一个动作失败了,那么整个事务都失败,而且要执行回滚操作。

Consistent(一致性)一旦事务结束(可能成功了也可能失败了),那么系统所模拟的业务逻辑要处于一致的状态。

数据不应该被实体关系破坏。

Isolated(隔离性)事务应该允许多个用户操作一个数据,一个用户的操作应该不受另一个用户操作的影响。

因此事务之间应该是相互隔离的,以阻止他们在操作中同时读写同一数据。

应用Spring框架中的事务管理应用技术

应用Spring框架中的事务管理应用技术
Spring声明式事务管理和EJB CMT它们两者的基本实 现方法在某些方面是相似的-----比如,都可以指定 事务管理到单独的方法; 如果需要可以在事务上下文调用setRollbackOnly() 方法。
(4)Spring声明式事务管理和EJB CMT的不同之处
不象 EJB CMT 绑定在 JTA 上, Spring 声明式事务管理可 以在任何环境下使用;同时,我们只需更改配置文件, 它就可以和 JDBC 、JDO 、 Hibernate 或其它的事务实现 的机制一起工作,相互集成在一起。 Spring 可以使声明式事务管理应用到普通 Java 对象, 不仅仅是特殊的类,如EJB组件类。 Spring 允许我们通过 AOP 定制事务行为。如果我们的 应用系统需要此功能,我们则可以在事务回滚中插入 定制的行为。
Spring提供声明式回滚规则:EJB没有对应的特性
7、声明控制的事务管理的优点
8、Spring中事务管理的一些相关类
注意: PlatformTransactionManager接口的应用
9、PlatformTransactionManager接口 (1)该接口的定义
(2)在该接口中定义了如下对事务控制的各个方法
(3)这样的设计方案给应用本身带来了以下优点
为复杂的事务 API 提供了一致的编程模型,如 JTA 、 JDBC、Hibernate、JPA和JDO 并支持声明式事务管理 提供比大多数复杂的事务API(诸如JTA)更简单的, 更易于使用的编程式事务管理API 非常好地整合Spring的各种数据访问抽象,并在不同 形式的数据访问组件中以统一的方式来应用 Spring中 的事务管理技术。
Байду номын сангаас

spring事务管理全解析

spring事务管理全解析

spring事务管理全解析事务是一组原子(Atomic)操作的工作单元,以数据库存取的实例来说,就是一组SQL指令,这一组SQL指令必须全部执行成功,若因为某个原因未全部执行成功(例如其中一行SQL有错误),则先前所有执行过的SQL指令都会被撤消。

JDBC是如何控制事务的try ...{.....connection.setAutoCommit(false);.....// 一连串SQL操作mit();} catch(SQLException) ...{// 发生错误,撤消所有变更connection.rollback();}Spring是把JDBC事务管理进来了封装,Spring事务管理的抽象关键在于org.springframework.transaction.PlatformTransactionManager接口里面有commit 和rollbackpublic interface PlatformTransactionManager ...{TransactionStatus getTransaction(TransactionDefinitiondefinition) throws TransactionException;void commit(TransactionStatus status)throws TransactionException;void rollback(TransactionStatus status)throws TransactionException;}TransactionDefinition接口的实例定义了事务的隔离程度(Isolation level)传播行为(Propagation behavior)超时(Timeout)只读(Read-only)等DataSourceTransactionManager、HibernateTransactionManager、JdoTransaction- Manager、JtaTransactionManager等是实现了该接口Spring提供编程式的事务管理(Programmatic transaction management)与声明式的事务管理(Declarative transaction management):1、编程式的事务管理可以清楚地控制事务的边界,也就是让您自行实现事务开始时间、撤消操作的时机、结束时间等,可以实现细粒度的事务控制。

Spring事务管理方法步骤解析

Spring事务管理方法步骤解析

Spring事务管理⽅法步骤解析1、Spring的事务管理主要包括3个接⼝TransactionDefinition:封装事务的隔离级别,超时时间,是否为只读事务和事务的传播规则等事务属性,可通过XML配置具体信息。

PlatformTransactionManager:根据TransactionDefinition提供的事务属性配置信息,创建事务。

TransactionStatus:封装了事务的具体运⾏状态。

⽐如,是否是新开启事务,是否已经提交事务,设置当前事务为rollback-only等。

2、Spring的事务管理:1、PlatformTransactionManager:接⼝统⼀,抽取处理事务操作相关的⽅法;(1):TransactionStatus getTransaction(TransactionDefinition definition):根据事务定义信息从事务环境中返回⼀个已存在的事务,或者创建⼀个新的事务,并⽤TransactionStatus描述该事务的状态。

(2):void commit(TransactionStatus status):根据事务的状态提交事务,如果事务状态已经标识为rollback-only,该⽅法执⾏回滚事务的操作。

(3):void rollback(TransactionStatus status):将事务回滚,当commit⽅法抛出异常时,rollback会被隐式调⽤2、在使⽤spring管理事务的时候,⾸先得告诉spring使⽤哪⼀个事务管理器;3、常⽤的事务管理器:DataSourceTransactionManager:使⽤JDBC,MyBatis的事务管理器;HibernateTransactionManager:使⽤Hibernate的事务管理器;3、步骤第⼀步:配置Spring的事务管理器(需要⽤的dataSource)第⼆步:配置事务<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:aop="/schema/aop"xmlns:tx="/schema/tx"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/context/schema/context/spring-context.xsd/schema/aop/schema/aop/spring-aop.xsd/schema/tx/schema/tx/spring-tx.xsd"><context:property-placeholder location="classpath:db.properties" system-properties-mode="NEVER"/><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driverClassName}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${ername}"/><property name="password" value="${jdbc.password}"/></bean><bean id="service" class="com.test.tx.service.impl.AccountServiceImpl"><property name="accountDao" ref="accountDao"/></bean><bean id="accountDao" class="com.test.tx.dao.impl.AccountDaoImpl"><property name="dataSource" ref="dataSource"/></bean><!--事务管理器--><bean id="manager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--配置事务--><aop:config><!--配置切⼊点,这⾥写⾃⼰想要使⽤Spring事务管理的类或接⼝,在上篇博客中有切⼊点配置⽅法--><aop:pointcut id="pointcut" expression="execution( * com.test.tx.service.IAccountService.*(..))"/><!--配置切⾯--><aop:advisor advice-ref="advice" pointcut-ref="pointcut"/></aop:config><!--事务增强器--><tx:advice id="advice" transaction-manager="manager"><tx:attributes><!--read-only可以将查询的⽅法设为只读事务--><tx:method name="*" read-only="false"/></tx:attributes></tx:advice></beans>第三步:进⾏事务的测试4、事务的注解配置⽅式第⼀步:加载驱动<!--事务的注解驱动,注解解析器需要关联事务管理器--><tx:annotation-driven transaction-manager="manager"/>第⼆步:在实现类上添加注解@Transactional注解中相应的属性可以配置事务控制的相关细节(隔离级别/传播规则/是否只读等) 类中的⽅法也可以添加@Transactional注解,同样可以对⽅法进⾏细节配置,⽅法中的配置信息会覆盖类中的同名配置。

JavaEE——Spring4--(9)Spring的事务管理(注解方式)

JavaEE——Spring4--(9)Spring的事务管理(注解方式)

JavaEE——Spring4--(9)Spring的事务管理(注解⽅式)⽤来确保数据的完整性和⼀致性.事务的四个关键属性(ACID)原⼦性(atomicity):事务是⼀个原⼦操作, 由⼀系列动作组成. 事务的原⼦性确保动作要么全部完成要么完全不起作⽤.⼀致性(consistency):⼀旦所有事务动作完成, 事务就被提交. 数据和资源就处于⼀种满⾜业务规则的⼀致性状态中.隔离性(isolation):可能有许多事务会同时处理相同的数据, 因此每个事物都应该与其他事务隔离开来, 防⽌数据损坏.持久性(durability):⼀旦事务完成, ⽆论发⽣什么系统错误, 它的结果都不应该受到影响. 通常情况下, 事务的结果被写到持久化存储器中.1.基于注解的导⼊相应的jar包 mysql C3P0 和Spring的AOP的<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd /schema/context /schema/context/spring- <!--扫描包--><context:component-scan base-package="jdbc"></context:component-scan><!--导⼊资源⽂件--><context:property-placeholder location="classpath:db.properties"/><!--配置C3P0数据源--><bean id="dataSource" class="boPooledDataSource"><property name="user" value="${er}"></property><property name="password" value="${jdbc.password}"></property><property name="driverClass" value="${jdbc.driverClass}"></property><property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property><property name="initialPoolSize" value="${jdbc.initPoolSize}"></property><property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property></bean><!--配置Spring的JDBCTemplate--><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean></beans> 相应的db.propertieser=rootjdbc.password=1234jdbc.driverClass=com.mysql.jdbc.Driverjdbc.jdbcUrl=jdbc:mysql://localhost:3306/db_personjdbc.initPoolSize=5jdbc.maxPoolSize=10⾸先配置组件扫描<context:component-scan base-package="jdbc"></context:component-scan>在xml配置了这个标签后,spring可以⾃动去扫描base-pack下⾯或者⼦包下⾯的java⽂件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类注册为bean再写出连接数据库后需要做的事情(增删改查)1.写增删改查的接⼝package jdbc.transactionManager;public interface BookShopDAO {//根据书号获取单价public double findPriceByIsbn(String isbn);//更新书的库存,使书号对应的库存-1public void updateBookStock(String isbn);//更新账户余额使username的balance-pricepublic void updateUserAccount(String username, double price);} 实现增删改查接⼝记得在实现的类上标上注解@Repository("bookShopDAO")还有 @Autowiredpackage jdbc.transactionManager;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.stereotype.Repository;@Repository("bookShopDAO")public class BookShopDAOImpl implements BookShopDAO {@Autowiredprivate JdbcTemplate jdbcTemplate;@Overridepublic double findPriceByIsbn(String isbn) {String sql = "SELECT price FROM book WHERE isbn = ?";return jdbcTemplate.queryForObject(sql, Double.class, isbn);}@Overridepublic void updateBookStock(String isbn) {//要检查书的库存是否⾜够,不够的话,要抛出异常String sql2 = "SELECT stock FROM book_stock WHERE isbn = ?";int stock = jdbcTemplate.queryForObject(sql2, Integer.class, isbn);if(stock == 0){throw new BookStockException("库存不⾜");}String sql = "UPDATE book_stock SET stock = stock - 1 WHERE isbn = ?";jdbcTemplate.update(sql, isbn);}@Overridepublic void updateUserAccount(String username, double price) {//要检查⽤户的余额,不够的话,要抛出异常String sql2 = "SELECT balance FROM account WHERE username = ?";double balance = jdbcTemplate.queryForObject(sql2, Double.class, username);if(balance <= price){throw new UserAccountException("余额不⾜");}String sql = "UPDATE account SET balance = balance - ? WHERE username = ?";jdbcTemplate.update(sql, price, username);}}注意判断条件,若不符合条件的抛出异常⾃⼰定义的异常⾸先要继承RunTimeException 然后写全部的构造器package jdbc.transactionManager;public class BookStockException extends RuntimeException {private static final long serialVersionUID = 1L;public BookStockException() {}public BookStockException(String message) {super( message );}public BookStockException(String message, Throwable cause) {super( message, cause );}public BookStockException(Throwable cause) {super( cause );}public BookStockException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super( message, cause, enableSuppression, writableStackTrace );}} 进⾏查询购买1.先写购买的接⼝package jdbc.transactionManager;public interface BookShopService {//顾客买书public void purchase(String username, String isbn);}2.在实现该接⼝在实现该购买接⼝时,注意在对应的⽅法上⾯添上事务注解@Transactional这样购买的流程就会成为⼀个事务,当余额或库存不⾜时,不会完成事务,会发⽣回滚package jdbc.transactionManager;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;@Service("bookShopService")public class BookShopServiceImpl implements BookShopService{@Autowiredprivate BookShopDAO bookShopDAO;//添加事务注解@Transactional@Overridepublic void purchase(String username, String isbn) {//获取书的单价double price = bookShopDAO.findPriceByIsbn(isbn);//更新书的库存bookShopDAO.updateBookStock(isbn);//更新⽤户的余额bookShopDAO.updateUserAccount(username, price);}} 注意还要在xml中进⾏事务配置<!--配置事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!--启⽤事务注解--><tx:annotation-driven transaction-manager="transactionManager"/> 完整的xml配置⽂件如下<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context" xmlns:tx="/schema/tx"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd /schema/context /schema/cont <!--扫描包--><context:component-scan base-package="jdbc"></context:component-scan><!--导⼊资源⽂件--><context:property-placeholder location="classpath:db.properties"/><!--配置C3P0数据源--><bean id="dataSource" class="boPooledDataSource"><property name="user" value="${er}"></property><property name="password" value="${jdbc.password}"></property><property name="driverClass" value="${jdbc.driverClass}"></property><property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property><property name="initialPoolSize" value="${jdbc.initPoolSize}"></property><property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property></bean><!--配置Spring的JDBCTemplate--><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><!--配置事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!--启⽤事务注解--><tx:annotation-driven transaction-manager="transactionManager"/></beans>。

spring事务管理

spring事务管理
2023/10/23
易可导航
示例代码:
UserManagerImpl类代码:
public void addUser(User user) { Session session = null; try { //session = HibernateUtils.getSession(); session = HibernateUtils.getSessionFactory().getCurrentSession(); session.beginTransaction(); session.save(user); //保存日志 Log log = new Log(); log.setType("安全日志"); log.setDetail("xxx进入系统"); log.setDate(new Date()); LogManagerImpl logManager = new LogManagerImpl(); logManager.addLog(log); session.getTransaction().commit(); } catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }
2023/10/23
易可导航
getCurrentSession()与openSession()的区别
❖ 采用getCurrentSession()创建的session会绑定到当前 线程中,而采用openSession()创建的session则不会。
❖ 采用getCurrentSession()创建的session在commit或 rollback时会ห้องสมุดไป่ตู้动关闭,而采用openSession()创建的 session必须手动关闭

Spring的事务管理

Spring的事务管理

配置JDO事务管理器 事务管理器 配置
<bean id=“transactionManager” class=“org.springframework.orm.jdo.JdoTransact ionManager”> <property name=“persistenceManagerFactory”> <ref bean=“persistenceManagerFactory”/> </property> </bean>
Spring的事务传播规则 的事务传播规则
传播行为
PROPAGATION_MANDATORY PROPAGATION_NESTED


表示该方法必须运行在一个事务中。如果当前事 务不存在,抛出异常 如果存在事务,那么该方法运行在一个嵌套的事 务中;不存在,和REQUIRED一样;需要厂商支 持 表示该方法不应该运行在一个事务上下文中。如 果存在一个事务,则会抛出一个异常 表示该方法不应该在事务中运行。如果一个现有 的事务正在运行,该方法在运行期被挂起 表示该方法必须运行在一个事务中。如果一个现 有的事务正在运行中,该方法将运行在这个事务 中。否则,开始一个新事务 表示当前方法必须运行在它自己的事务里。它将 启动一个新的事务,如果已经有事务运行,挂起 当前方法不需要事务处理环境,但如果有一个事 务在运行,这个方法也可以在这个事务里运行
配置Hibernate事务管理器 事务管理器 配置
<bean id=“transactionManager” class=“org.springframework.orm.hibernate3.HibernateTr ansactionManager”> <property name=“sessionFactory”> <ref bean=“sessionFactory”/> </property> </bean>
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

浅析Spring提供的事务管理方法
Spring提供的事务管理可以分为两类:编程式的和声明式的。

编程式的,比较灵活,但是代码量大,存在重复的代码比较多;而声明式的比编程式的更灵活方便。

本文将讨论这两种事务管理的区别。

传统的JDBC事务管理
以往使用JDBC进行数据操作时,一般采用DataSource,从数据源中得到Connection,我们知道数据源是线程安全的,而连接不是线程安全的,所以对每个请求都是从数据源中重新取出一个连接。

一般的数据源由容器进行管理,包括连接池。

例如TOMCAT,WEBSPHERE,WEBLOGIC等这些J2EE商业容器都提供了这个功能。

以往的我们使用JDBC在写代码时,事务管理可能会是这样:
Connection conn = null;
try
{
conn = DBConnectionFactory.getConnection;
conn.setAutoCommit(false);
//do something
mit(); //commit transcation
}
catch(Exception e)
{
conn.rollback();
//do sth
}
finally
{
try
{
conn.close();
catch(SQLException se){ //do sth.}
//close ResultSet,PreparedStatement,Connection
//notice:Maybe ocurr Exception when u close rs,pstmt,conn
}
按照以往的思路来写代码,代码量比较长,而且容易疏忽,忘掉一些try/catch,引发一些异常无法catch,虽然有时候我们会写DBTool类,来关闭这些资源,并且保证在关闭这些资源时,不向外抛异常。

Spring提供的编程式的事务处理
Spring提供了几个关于事务处理的类:
?TransactionDefinition //事务属性定义
?TranscationStatus //代表了当前的事务,可以提交,回滚。

?PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。

我们使用编程式的事务管理流程可能如下:
1 声明数据源
2 声明一个事务管理类,例如DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager等
3 在我们的代码中加入事务处理代码:
TransactionDefinition td = new TransactionDefinition();
TransactionStatus ts = transactionManager.getTransaction(td);
try
{
//do sth
mit(ts);
}
catch(Exception e){transactionManager.rollback(ts);}
使用spring提供的事务模板TransactionTemplate
void add()
transactionTemplate.execute( new TransactionCallback(){
pulic Object doInTransaction(TransactionStatus ts)
{ //do sth}
}
}
TransactionTemplate也是为我们省去了部分事务提交、回滚代码;定义事务模板时,需注入事务管理对象.
Spring声明式事务处理
Spring声明式事务处理也主要使用了ioc,aop思想,提供了TransactionInterceptor 拦截器和常用的代理类TransactionProxyFactoryBean,可以直接对组件进行事务代理。

使用TransactionInterceptor步骤
1.定义数据源,事务管理类
2.定义事务拦截器,such as:
<bean id = "transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="transactionAttributeSource">
<value>
erManager.*r=PROPAGATION_REQUIRED
</value>
</property>
</bean>
3.为组件声明一个代理类:ProxyFactoryBean
<bean id="userManager" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces"><value>erManager</value></property>
<property name="interceptorNames">
<list>
<idref local="transactionInterceptor"/>
</list>
</property>
</bean>
使用TransactionProxyFactoryBean:
<bean id="userManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"><property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="target"><ref local="userManagerTarget"/></property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
TransactionProxyFactoryBean只是为组件的事务代理,如果我们要给组件添加一些业务方面的验证等,可以使用TransactionTemplate加拦截器方式,为组件添加多个拦截器,spring AOP中提供了三类Advice,即前增强,后增强,抛出异常时的增强,可以灵活使用。

相关文档
最新文档