在软件中,要么全有(全部发生)要么全无(全部都没发生)的操作称为事务!
spring的事务管理与spring的缓存机制一样,都是基于spring的AOP,因此,spring的事务管理与spring的缓存机制在配置上是非常相似的。spring的事务管理包括编程式事务、基于xml配置式事务、注解驱动式事务。下面分别介绍这三种事务管理。
在介绍spring事务管理之前,有必要对事务的一些参数作出说明
1.spring事务参数
spring事务参数在org.springframework.transaction.TransactionDefinition接口中作出了常量定义。
1.1传播行为(PROPAGATION)
事务传播行为
传播行为 |
意义 |
PROPAGATION_MANDATORY |
表示该方法必须运行在一个事务中。如果当前没有事务正在发生,将抛出一个异常 |
PROPAGATION_NESTED |
表示如果当前正有一个事务在进行中,则该方法应当运行在一个嵌套式事务中。被嵌套的事务可以独立于封装事务进行提交或回滚。如果封装事务不存在,行为就像PROPAGATION_REQUIRED一样。请注意各厂商对于这种传播行为的支持是参差不齐的。请参考资源管理器的文档,确定它们是否支持嵌套式事务 |
PROPAGATION_NEVER |
表示当前的方法不应该在一个事务性上下文中运行。如果当前正有一个事务在运行,则会抛出一个异常 |
PROPAGATION_NOT_SUPPORTED |
表示该方法不应该在一个事务中运行。如果一个现有的事务正在进行中,它将在该方法的运行期间被挂起 |
PROPAGATION_REQUIRED |
表示当前方法必须在一个事务中运行。如果一个现有的事务正在进行中,该方法将会在那个事务中运行。否则的话,就要开始一个新的事务 |
PROPAGATION_REQUIREDS_NEW |
表示当前方法必须在它自己的事务里运行。一个新的事务将被启动,而且如果有一个现有事务正在运行的话,则将在这个方法运行期间被挂起。如果正在使用JTATransactionManager,则需要访问TransactionManager |
PROPAGATION_SUPPORTS |
表示当前方法不需要事务性上下文,但是如果有一个事务已经在运行的话,它也可以在这个事务里运行 |
1.2事务隔离级别
spring的事务隔离级别
隔离级别 |
含义 |
ISOLATION_DEFAULT |
使用后端数据库默认的隔离级别 |
ISOLATION_READ_UNCOMMITTED |
允许读取尚未提交的更改。可能导致脏读、幻读或不可重复读 |
ISOLATION_READ_COMMITED |
允许从已经提交的并发事务读取。可防止脏读、幻读或不可重复读 |
ISOLATION_REPEATABLE_READ |
对相同字段的多次读取的结果是一致的,除非数据被当前事务本身改变。可防止脏读和不可重复读,但幻读仍可发生 |
ISOLATION_SERIALIZABLE |
完全服从ACID的隔离级别,确保不发生脏读、不可重复读和幻读。这在所有隔离级别中也是最慢的,因为它通常是通过完全锁定当前事务所涉及的数据表来完成的。 |
1.3只读
如果一个事务只对后端数据库执行读操作,那么该数据库就可能可以利用那个事务的只读特性,采取某些优化措施。由于只读的优化措施是在一个事务启动时由后端数据库实施的,因此,只有对于那些具有可能启动一个新事务的传播行为(PROPAGATION_REQUIRED,PROPAGATION_REQUIREDS_NEW,PROPAGATION_NESTED)的方法来说,将事务声明为只读才有意义。
1.4事务超时
声明一个事务,在特定的秒数之后自动回滚,而不必等它自己结束。
1.5回滚规则
回滚规则定义哪些异常会引起回滚,哪些不引起。在默认设置下,事务只在出现运行异常(runtime exception)时回滚,而在出现受阻异常(checked exception)时不回滚。不过,也可以在回滚规则中声明一个事务在出现特定的受阻异常时像运行时异常一样回滚。同样,也可以声明一个事务在出现特定的异常时不回滚,包括运行时异常。
2.spring的事务管理器
spring中的事务管理器它就是AOP中的Advice!或者可以这样去理解它!事务管理器中包含了事务管理的功能代码。
spring提供了多个基于特定持久平台的事务管理器,所有这些事务管理器都实现了
org.springframework.transaction.PlatformTransactionManager。
下面是jdbc的事务管理器的配置(其它持久平台的事务管理器的配置很相似):
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean>
3.基于XML方式配置事务
3.1代理事务
<bean id="rantService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="target" ref="rantServiceTarget" /> <property name="proxyInterfaces" value="com.roadrantz.service.RantService" /> <property name="transactionManager" ref="transactionManager"></property> <property name="transactionAttributes"> <props> <prop key="add*">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop> </props> </property> </bean>
transactionAttributes中的配置按如下的顺序:
PROPAGATION,ISOLATION(可选),readOnly(可选),-Exception(可选),+Exception(可选)
3.2 spring2.0事务的简化配置
<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="*" propagation="SUPPORTS" read-only="true" /> </tx:attributes> </tx:advice> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* *..RantService.*(..))" /> </aop:config>
4.注解驱动式事务配置
- 添加如下配置
<tx:annotation-driven transaction-manager="transactionManager"/>
- 在相应的类的类级别或方法级别上添加@Transactional注解
@Transactional(propagation=Propagation.SUPPORTS,readOnly=true)public class RantServiceImpl implements RantService{... @Transactional(propagation=Propagation.REQUIRED,readOnly=false) public void addRant(Rant rant){}}
5.编程式事务管理
(略)
分享到:
相关推荐
Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...
### Spring事务与数据库操作 #### 一、Spring的声明式事务管理 在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。...
Spring事务管理是Spring框架的核心特性之一,主要用于处理应用程序中的数据一致性问题。在Spring中,事务管理分为编程式和声明式两种方式。本篇文章将详细解释Spring事务管理的流程,以及如何通过时序图来理解这一...
本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理、编译工具以及与数据库交互的相关jar包。下面将对这些知识点进行详细解释: 1. **Spring框架*...
Spring事务原理和配置 Spring事务原理是指Spring框架中的一种机制,用于管理事务,并提供了多种配置方式。事务是指一系列的操作,作为一个整体执行,如果其中某个操作失败,整个事务将回滚。Spring事务原理围绕着两...
本主题将深入探讨“Spring事务案例分析.zip”中的关键知识点,包括Spring事务管理及其在实际项目中的应用。 首先,我们来了解什么是Spring事务管理。在分布式系统或数据库操作中,事务管理是确保数据一致性和完整性...
标题“Spring事务管理失效原因汇总”指出了本文的核心内容是分析在使用Spring框架进行事务管理时可能遇到的问题及其原因。描述部分进一步说明了事务失效的后果往往不明显,容易在测试环节被忽略,但在生产环境中出现...
在Spring框架中,事务管理是核心特性之一,它允许开发者以声明式或编程式的方式处理事务。本示例“spring 事务传播 demo”将聚焦于Spring的事务传播行为,这是在多个方法调用中控制事务边界的关键概念。下面我们将...
这个名为"Spring事务小demo"的项目提供了一个实践示例,帮助开发者了解Spring事务处理的基本概念和用法。 首先,Spring事务管理是Spring框架的核心特性之一,它允许我们以声明式或编程式的方式管理事务。声明式事务...
本篇将深入探讨Spring事务管理的核心概念、工作原理以及如何使用`spring-tx-3.2.0.RELEASE.jar`这个jar包。 首先,我们需要理解什么是事务。在数据库系统中,事务是一组操作,这些操作被视为一个整体,要么全部完成...
本文将深入探讨在Spring框架中如何管理事务,以“Spring 事务简单完整例子”为出发点,结合标签“spring,事务,jdbc事务”,我们将详细解释Spring事务管理的原理和实践。 首先,Spring提供了两种事务管理方式:编程...
Spring事务详细讲解 在 Spring 框架中,事务管理扮演着非常重要的角色。Spring 声明式事务让我们从复杂的事务处理中得到解脱,使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要...
Spring事务机制是Java开发中非常重要的一个概念,它在企业级应用中扮演着核心角色,确保数据的一致性和完整性。Spring提供了多种事务管理方式,包括编程式事务管理和声明式事务管理。在这篇DEMO中,我们将重点探讨...
本DEMO主要探讨的是Spring事务的传播行为和隔离级别,这些概念对于理解和优化数据库操作至关重要。让我们深入理解这些概念及其实际应用。 首先,我们来谈谈事务的传播行为。在Spring中,当一个方法被另一个具有事务...
当我们在使用 Spring 所提供的事务功能时,如果是仅仅处理单个的事务,是比较容易把握事务的提交与回滚,不过一旦引入嵌套事务后,多个事务的回滚和提交就会变得复杂起来,各个事务之间是如何相互影响的,是一个值得...
Spring事务操作示例(四种方式),包含完整代码和数据库文件(基于MySQL,在项目sql文件夹中),可运行,学习Spring事务详见博客:http://blog.csdn.net/daijin888888/article/details/51822257
本篇将基于"Spring事务传播Demo"来深入探讨Spring事务管理和传播行为。 首先,我们需要理解什么是事务。在数据库操作中,事务是一组操作,这些操作要么全部执行,要么全部不执行,以确保数据的一致性和完整性。在...
Spring事务管理是Spring框架的核心特性之一,主要用于处理应用程序中的数据一致性问题。在多线程、分布式系统中,事务管理显得尤为重要。本节将详细介绍Spring如何通过XML配置和注解方式来实现事务管理。 首先,...