`

spring事务管理

 
阅读更多

 一、要弄清spring是如何进行事务管理的,首先来看两个接口:

1. TransactionDefinition   它包含了一些事务属性的定义(传播类型等)

 

public interface TransactionDefinition {

//....省略部分代码

 

//定义了7种事务的传播类型

  int PROPAGATION_REQUIRED = 0;

  int PROPAGATION_SUPPORTS = 1;

  int PROPAGATION_MANDATORY = 2;

  int PROPAGATION_REQUIRES_NEW = 3;

  int PROPAGATION_NOT_SUPPORTED = 4;

  int PROPAGATION_NEVER = 5;

  int PROPAGATION_NESTED = 6;

 

  //获取事务的传播类型
  int getPropagationBehavior(); 

 

}

  

2. PlatformTransactionManager  事务管理器接口;真正的事务管理就是由这个接口的实现类来完成的。

public interface PlatformTransactionManager {

    //通过事务的定义,来获取一个事务的当前状态

    TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;

    // 依照事务的状态来完成提交

    void commit(TransactionStatus status) throws TransactionException;

   // 回滚

    void rollback(TransactionStatus status) throws TransactionException;

}

  

二、事务管理的实现

  1.  spring 的事务管理分为两种方式:编程式和声明式;

    <1> 编程式:使用硬编码的方式来完成事务操作。在sping里面,又有两种方式来完成编程式事务:

    a.使用 PlatformTransactionManager  接口

  

 DefaultTransactionDefinition  dtd = new DefaultTransactionDefinition();//创建事务
dtd.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);//设置事务传播类别
TransactionStatus  ts =  transactionManager.getTransaction(dtd);//获取事务状态
 try{
	userStepMappingDao.add(us);//保存对象US
	stepCategoryDao.add(usd);//保存对象USD
	transactionManager.commit(ts);//提交
   }catch(Exception e){
	transactionManager.rollback(ts);//回滚
		 }	

 

    b.使用TransactionTemplate;看一下源码

public class TransactionTemplate extends DefaultTransactionDefinition
		implements TransactionOperations, InitializingBean {
    //可以看到, TransactionTemplate继承自DefaultTransactionDefinition

    //内部还是使用了PlatformTransactionManager接口

private PlatformTransactionManager transactionManager;

  

   //看一下主要的方法:

   

public <T> T execute(TransactionCallback<T> action)
			throws TransactionException {
		// 如果当前的事务管理器实现了CallbackPreferringPlatformTransactionManager接口
		// ,则直接调查用接口的execute方法,这部分我们以后再看
		if (this.transactionManager instanceof CallbackPreferringPlatformTransactionManager) {
			return ((CallbackPreferringPlatformTransactionManager) this.transactionManager)
					.execute(this, action);
		} else {

			// 由于继承自 DefaultTransactionDefinition,直接获取事务状态
			TransactionStatus status = this.transactionManager
					.getTransaction(this);
			T result;
			try {

				// 这里action.doInTransaction(status);是我们自己的应用代码
				// (这里考虑是否通过反射来调用DAO里面的方法)
				result = action.doInTransaction(status);
			} catch (RuntimeException ex) {
				// Transactional code threw application exception -> rollback

				// point A:
				rollbackOnException(status, ex);
				throw ex;
			} catch (Error err) {
				// Transactional code threw error -> rollback

				// point B:
				rollbackOnException(status, err);
				throw err;
			} catch (Exception ex) {
				// Transactional code threw unexpected exception -> rollback

				// point C:
				rollbackOnException(status, ex);
				throw new UndeclaredThrowableException(ex,
						"TransactionCallback threw undeclared checked exception");
			}
			// 提交
			this.transactionManager.commit(status);
			return result;
		}
	}

 

 可以看到,最终还是调用ransactionManager的rollback()方法。所以TransactionTemplate只是对PlatformTransactionManager作了一个内部调用而已。

 

 

<2>声明式:这也是最常用的方法,因这这种方法不会发生任何的代码侵入;

a. 使用org.springframework.transaction.interceptor.TransactionProxyFactoryBean进行手动代理

<bean id="baseTxProxy" abstract="true"
		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
		<property name="transactionManager">
			<ref bean="transactionManager" /> //注入事务管理器
		</property>
		<!-- 这里通过target属性为某个接口加上事务,通过方法名来匹配 -->
		<property name="target">
			<ref  bean="testTran" />//需要加事务的service
		</property>
		<property name="transactionAttributes">
			<props>
				<prop key="add*">PROPAGATION_REQUIRED</prop> 
				<prop key="update*">PROPAGATION_REQUIRED</prop>
				<prop key="delete*">PROPAGATION_REQUIRED</prop>
				<prop key="save*">PROPAGATION_REQUIRED</prop>
				<prop key="remove*">PROPAGATION_REQUIRED</prop>
				<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
			</props>
		</property>
	</bean>

 b.使用sping AOP

               <tx:annotation-driven transaction-manager="transactionManager" />    //配置事务管理器

	<tx:advice id="defaultTxAdvice" transaction-manager="transactionManager">    //事务属性
		<tx:attributes>
			<tx:method name="*Transaction" propagation="REQUIRED"  //propagation 事务传播类型
				rollback-for="Exception" />//所有exception回滚,相对的还有no-rollback-for属性
			<tx:method name="find*" propagation="SUPPORTS" read-only="true" />//read-only="true"事务只读
			<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
			<tx:method name="fetch*" propagation="SUPPORTS" read-only="true" />
			<tx:method name="is*" propagation="SUPPORTS" read-only="true" />
			<tx:method name="*_noTrans" propagation="NOT_SUPPORTED" />
		</tx:attributes>
	</tx:advice>

	<aop:config>
		<aop:pointcut id="allManagerMethod"   //切点
			expression=" (
                                     execution(* com.managerment.service.impl..*.*(..))  //第一个*与包路径之间有空格
                                 //第一个* :任何返回类型  第二个*  :impl下所有的类 第三个*: 所有的方法   第一个.. (即impl..) :impl下的所有子包 第二个.. (即(..)):所有参数
                                                                                                             
                          ) " />
		<aop:advisor advice-ref="defaultTxAdvice" pointcut-ref="allManagerMethod" />//通知
	</aop:config>

 

    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Spring事务管理Demo

    Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...

    Spring事务管理开发必备jar包

    本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理、编译工具以及与数据库交互的相关jar包。下面将对这些知识点进行详细解释: 1. **Spring框架*...

    spring 事务管理的理解

    Spring 框架是Java开发中...理解并熟练掌握Spring事务管理,对于提升应用程序的稳定性和可靠性至关重要。在实际开发中,结合声明式事务管理、事务传播行为、隔离级别和回滚规则,可以有效地确保数据的完整性和一致性。

    Spring事务管理.pdf

    Spring事务管理.pdf 1.资料 2.本地事务与分布式事务 3.编程式模型 4.宣告式模型

    Synchronized锁在Spring事务管理下线程不安全

    Synchronized锁在Spring事务管理下,导致线程不安全。

    Spring事务管理的jar包

    本篇将深入探讨Spring事务管理的核心概念、工作原理以及如何使用`spring-tx-3.2.0.RELEASE.jar`这个jar包。 首先,我们需要理解什么是事务。在数据库系统中,事务是一组操作,这些操作被视为一个整体,要么全部完成...

    Spring事务管理失效原因汇总

    标题“Spring事务管理失效原因汇总”指出了本文的核心内容是分析在使用Spring框架进行事务管理时可能遇到的问题及其原因。描述部分进一步说明了事务失效的后果往往不明显,容易在测试环节被忽略,但在生产环境中出现...

    spring事务管理5种方法

    本篇文章将深入探讨Spring事务管理的五种方法,旨在帮助开发者更好地理解和运用这一核心特性。 首先,我们来了解什么是事务。在数据库操作中,事务是一组逻辑操作,这些操作要么全部成功,要么全部失败,确保数据的...

    Spring事务管理4种方式

    本文将详细介绍Spring事务管理的四种方式:编程式事务管理、声明式事务管理、PlatformTransactionManager接口以及TransactionTemplate。 1. **编程式事务管理**:这是一种手动控制事务的方式,通过在代码中调用`...

    详细介绍Spring事务管理

    ### Spring事务管理详解 #### 一、Spring事务管理的重要性及必要性 在现代软件开发中,事务管理是一项至关重要的技术,特别是在涉及数据库操作时。事务能够确保一系列操作要么全部成功,要么全部失败,这对于保持...

    spring事务管理.rar

    Spring事务管理是Spring框架的核心特性之一,它提供了一种强大且灵活的方式来管理应用程序中的事务边界。在企业级Java应用中,事务处理是确保数据一致性、完整性和可靠性的关键部分。本篇文章将深入探讨Spring的事务...

    spring事务管理.doc

    总的来说,Spring事务管理提供了一种灵活、强大的方式来处理应用程序中的事务,无论是在简单还是复杂的事务场景下,都能有效保证数据的一致性和完整性。通过声明式事务管理,开发者可以将关注点从事务细节中解脱出来...

    Spring事务管理

    Spring事务管理是Spring框架的核心特性之一,它提供了一种在Java应用中管理和协调数据库事务的标准方式。对于有Java基础的开发者来说,理解并掌握Spring事务管理至关重要,因为这有助于确保数据的一致性和完整性,...

    Spring事务管理配置文件问题排查

    当出现像描述中那样的问题——SQL语句执行出错但事务未回滚时,我们需要深入理解Spring事务管理的配置和机制。以下是一些关键知识点: 1. **Spring事务管理类型**: - **编程式事务管理**:通过`...

    spring事务管理几种方式代码实例

    spring事务管理几种方式代码实例:涉及编程式事务,声明式事务之拦截器代理方式、AOP切面通知方式、AspectJ注解方式,通过不同方式实例代码展现,总结spring事务管理的一般规律,从宏观上加深理解spring事务管理特性...

    Spring事务管理和SpringJDBC思维导图

    在思维导图"Spring Transaction.twd"中,可能包含了Spring事务管理的各个概念和它们之间的关系,如事务的ACID属性(原子性、一致性、隔离性和持久性),事务管理器,以及声明式和编程式事务管理的实现方式。...

    Spring事务管理的方法

    ### Spring事务管理的方法 #### 一、引言 在企业级应用开发中,事务管理是一项至关重要的技术。Spring框架作为Java领域中一个非常流行的轻量级框架,为开发者提供了多种方式来实现事务管理,其中主要分为编程式...

Global site tag (gtag.js) - Google Analytics