<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- 引进src 下的properties配置文件 -->
<context:property-placeholder location="classpath:cn/test2/base10_transaction/jdbc.properties" />
<context:component-scan base-package="cn.goso.twoSessions" />
<!-- 数据源管理 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<!--可以这样从properties文件中取参数-->
<property name="driverClass" value="${driverClassName}" />
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf8" />
<property name="user" value="root" />
<property name="password" value="123456" />
<!-- 初始化时获得的连接数,取值应在minPoolSize和maxPoolSize之间,默认是3 -->
<property name="initialPoolSize" value="1" />
<!-- 连接池中保留的最小连接数 -->
<property name="minPoolSize" value="1" />
<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="60" />
<!--连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize" value="15" />
<!-- 当连接池耗尽的时候c3p0一次性获取的连接数, 默认是3 -->
<property name="acquireIncrement" value="5" />
<!-- 隔多久检查连接池中的空闲连接 ,默认是0 -->
<property name="idleConnectionTestPeriod" value="60" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<!--spring事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--
<tx:annotation-driven transaction-manager="txManager" />
-->
<tx:advice id="txAdvice" transaction-manager=" txManager ">
<tx:attributes>
<!-- get方法不走事务
<tx:method name="get*,find*" read-only="true" propagation="NOT_SUPPORTED"/>
-->
<!-- 支持当前事务,如果当前没有事务,就新建一个事务
*表示所有方法
-->
<tx:method name="*" rollback-for="Exception" isolation="DEFAULT" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<!-- ..表示cn 下所有包所有类 * 表示所有方法名称(..) 表示所有方法参数
可以cn..service.impl..*(..) 表示
-->
<aop:pointcut id="transactionPointcut" expression="execution(* cn..*(..))" />
<aop:advisor advice-ref=" txAdvice " pointcut-ref="transactionPointcut" />
</aop:config>
</beans>
1、Spring中常用事务类型: 用于配置在<tx:method /> 的propagation 属性下
.PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
• PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
• PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
• PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
• PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
• PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
• PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
2、<tx:advice/> 有关的设置
通过 <tx:advice/> 标签来指定不同的事务性设置。默认的 <tx:advice/> 设置如下: /
• 事务传播设置是 REQUIRED
• 隔离级别是 DEFAULT
• 事务是 读/写
• 事务超时默认是依赖于事务系统的,或者事务超时没有被支持。
• 任何 RuntimeException 将触发事务回滚,但是任何 checked Exception 将不触发事务回滚
这些默认的设置当然也是可以被改变的。 <tx:advice/> 和 <tx:attributes/> 标签里的 <tx:method/> 各种属性设置总结如下:
<tx:method/> 有关的设置
属性 是否需要? 默认值 描述
---------------------------------------------------------------------------------------------------
name 是 与事务属性关联的方法名。通配符(*)可以用来指定一批关联到相同的事务属性的方法。 如:'get*'、'handle*'、'on*Event'等等。
---------------------------------------------------------------------------------------------------
propagation 不 REQUIRED 事务传播行为
---------------------------------------------------------------------------------------------------
isolation 不 DEFAULT 事务隔离级别
---------------------------------------------------------------------------------------------------
timeout 不 -1 事务超时的时间(以秒为单位)
---------------------------------------------------------------------------------------------------
read-only 不 false 事务是否只读?
---------------------------------------------------------------------------------------------------
rollback-for 不 将被触发进行回滚的 Exception(s);以逗号分开。 如:'com.foo.MyBusinessException,ServletException'
----------------------------------------------------------------------------------------------
no-rollback-for 不 不 被触发进行回滚的 Exception(s);以逗号分开。 如:'com.foo.MyBusinessException,ServletException'
-------------------------------------------------------------------------------------------------
isolation 不 DEFAULT 数据库提供了四种事务隔离级别
3、数据可以事务的隔离级别
# ISOLATION_DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应
# ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
# ISOLATION_READ_COMMITTED 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。
# ISOLATION_REPEATABLE_READ 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
# ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。
4、可以配置多个数据源,控制事务。需清除,配置的
<aop:pointcut id="transactionPointcut" expression="execution(* cn..*(..))" />
要拦截可以抛出异常的类。
***
需注意:
txManager配置的多个名称不可以相同,包括txAdvice名称也不可用相同,但是配置的aop 拦截的包可以是重复的,方便异常时回滚
分享到:
相关推荐
### AOP与Spring事务处理详解 #### 一、引言:为什么使用框架和设计模式? 在软件开发领域,设计模式和框架是两个重要的概念。设计模式作为一种指导思想,能够帮助开发者更好地解决常见的软件设计问题,确保系统...
Spring 事务处理是Java开发中一个至关重要的概念,特别是在企业级应用中,它确保了数据的一致性和完整性。Spring 提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。本篇将深入探讨Spring声明式事务...
Spring事务处理是其核心特性之一,确保了数据的一致性和完整性。本篇文章将聚焦于Spring事务处理中ThreadLocal的使用,以及如何通过源码理解和应用这个工具。 首先,了解Spring事务管理的基本概念。在多线程环境中...
Spring事务处理原理步骤详解 Spring事务处理原理步骤详解是指在Spring框架中实现事务处理的整个过程,它涉及到事务处理的实现、事务处理原理和事务管理器的配置等几个方面。下面是Spring事务处理原理步骤详解的知识...
本教程主要聚焦于Spring框架的两大核心特性:Spring AOP(面向切面编程)和Spring事务处理,通过具体的应用案例来深入理解这两个概念。 首先,让我们详细探讨Spring AOP。AOP是面向切面编程的缩写,它允许程序员...
这个名为"Spring事务小demo"的项目提供了一个实践示例,帮助开发者了解Spring事务处理的基本概念和用法。 首先,Spring事务管理是Spring框架的核心特性之一,它允许我们以声明式或编程式的方式管理事务。声明式事务...
Spring事务管理提供了统一的事务处理模型,使得开发者无需关注具体数据库访问技术的事务细节,简化了事务控制代码,提高了代码的可读性和可维护性。无论是使用注解还是AOP配置,都能有效地管理和协调事务,确保应用...
总的来说,Spring事务管理通过其强大的声明式事务处理能力和对各种事务策略的支持,使得开发者能够轻松地在应用程序中实现高效、一致的事务处理。通过理解并合理运用上述知识点,开发者可以构建出稳定、健壮的分布式...
虽然提供的示例是入门级别的,但它揭示了Spring事务管理的核心概念,为进一步学习和理解Spring事务处理的高级特性奠定了基础。在实际项目中,我们需要根据需求选择合适的配置,确保事务的正确性和数据的一致性。
总的来说,Spring事务管理是一个强大的工具,它简化了事务处理的复杂性,使得开发者能够专注于业务逻辑,而无需过多关注事务的细节。通过理解和使用Spring事务流程图,我们可以更好地设计和优化我们的应用程序,确保...
本篇文章将深入探讨Spring事务处理的流程和原理。 一、事务理论学习 事务是数据库操作的基本单位,它封装了一组数据库操作,要么全部执行,要么全部回滚。事务具有四大特性,即ACID(原子性Atomicity、一致性...
在使用Spring事务处理时,需要在配置文件中定义事务管理器,并将其注入到目标对象中。目标对象可以是Service层或DAO层,事务管理器将根据事务的配置来控制事务的行为。 Spring的事务处理提供了多种事务传播行为,...
Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...
### Spring事务与数据库操作 #### 一、Spring的声明式事务管理 在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。...
Spring 源代码分析系列涵盖了多个关键模块,包括事务处理、IoC容器、JDBC、MVC、AOP以及与Hibernate和Acegi安全框架的集成。以下是对这些知识点的详细阐述: 1. **Spring 事务处理**:Spring 提供了声明式事务管理...
首先,我们要理解Spring事务管理的两种主要方式:编程式事务管理和声明式事务管理。编程式事务管理通常通过AOP(面向切面编程)的TransactionTemplate或PlatformTransactionManager接口直接在代码中控制事务,而声明...
Spring框架的声明式事务处理是Java企业级应用中不可或缺的一部分,它为开发者提供了一种方便、高效的方式来管理事务。在Spring中,事务管理分为编程式和声明式两种方式,而声明式事务处理则是通过配置来控制事务的...
在Spring框架中,事务管理是实现业务逻辑时不可或缺的一部分,它确保了数据的一致性和完整性。本资源包提供了进行Spring事务管理开发所需的所有关键库...理解并掌握这些知识点,将有助于构建稳定、健壮的事务处理系统。