`
PanShuiHua
  • 浏览: 31349 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
最近访客 更多访客>>
社区版块
存档分类
最新评论

Spring三种事务处理方式

阅读更多

1、用原始的transactionfactorybean,代理dao事务处理

2、用aop:config声明要进行事务增强的切面,tx:advice声明具体方法的事务属性,及应用到的事务管理器

3、使用@transactional注解配置声明事务(最简单实用的方法)

如有一代表用户的域对象user:
package com.domain;
import java.io.serializable;
public class user implements serializable{
private int user_id;
private string user_name;
private string user_password;
private string user_desc;
....//
省略setget方法

}

user的数据库操作接口:
package com.dao;
import com.domain.user;
public interface userdao {
public void adduser(user user);
}

有一继承spring jdbc支持类的userdao接口实现类,实现添加一个user的方法。它需要注入一个spring jdbc模板类jdbctemplate
package com.dao.jdbc;
import com.domain.user;
import com.dao.userdao;
import org.springframework.jdbc.core.support.jdbcdaosupport;

public class userjdbcdao extends jdbcdaosupport implements userdao{
public void adduser(user user){
string sql =
"insert into user(user_name,user_password,user_desc) values(?,?,?)";
object[] params = new object[]{
user.getuser_name(),
user.getuser_password(),
user.getuser_desc()
} ;
this.getjdbctemplate().update(sql, params);
}
}

以上dao层的类对应的bean的基本配置文件app_dao.xml如下(数据源的属性放入了外部的资源文件"prop.properties"):

<bean class="org.springframework.beans.factory.config.propertyplaceholderconfigurer">
<property name="location" value="classpath:prop.properties"/>
</bean>
<!--
数据源
-->
<bean id="datasource" class="org.apache.commons.dbcp.basicdatasource"
destroy-method="close">
<property name="driverclassname" value="${jdbc.driverclassname}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--spring jdbc
模板bean,它注入了上面的数据源
-->
<bean id="jdbctemplate" class="org.springframework.jdbc.core.jdbctemplate">
<property name="datasource" ref="datasource"/>
</bean>

<!--user数据操作的bean声明,它注入了上面的spring jdbc模板bean:jdbctemplate-->
<bean id="userjdbcdao"
class="com.dao.jdbc.userjdbcdao">
<property name="jdbctemplate" ref="jdbctemplate"/>
</bean>
</beans>


这里我简单地模拟业务类(业务接口userservice省略)
package com.service.impl;
import com.dao.userdao;
import com.domain.user;
import com.service.userservice;

public class userserviceimpl implements userservice {
private userdao userdao;
public void setuserdao(userdao userdao){
this.userdao = userdao;
}
public void adduser(user user){
this.userdao.adduser(user);
}
}

为了在业务类中使用事务管理功能,有如下几个方法:
1
、用原始的transactionfactorybeanapp.xml基本配置:

<import resource="classpath:app_dao.xml"/><!--导入dao层的配置-->
<!--spring jdbc
的事务管理bean,引入了dbcp数据源
-->
<bean id="txmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager">
<property name="datasource" ref="datasource"/>
</bean>
<!--
业务类
bean-->
<bean id="userserviceimpltarget" class="com.service.impl.userserviceimpl">
<property name="userdao" ref="userjdbcdao"/>
</bean>

<!--应用原始的transactionfactorybean进行事务管理bean的声明-->
<bean id="userserviceimpl"class="org.springframework.transaction.interceptor.transactionproxyfactorybean">
<property name="transactionmanager" ref="txmanager"/><!--
指定事务管理
bean-->
<property name="target" ref="userserviceimpltarget"/><!--
指定业务
bean-->
<property name="transactionattributes"><!--
事务的属性设置列表
-->
<props>
<prop key="add*">propagation_required,isolation_serializable</prop>
<!--
设置事务为只读时,添加数据将会产生异常
-->
<!--<prop key="add*">propagation_required,isolation_serializable,readonly</prop>-->
</props>
</property>
</bean>

测试:
......
userserviceimpl usi = (userserviceimpl)ctx.getbean("userserviceimpl");
......

2、用tx/aop命名空间配置:

<?xml version="1.0" encoding="utf-8"?>
<beans .....
xmlns:tx="
http://www.springframework.org/schema/tx
"
xsp:schemalocation="
http://www.springframework.org/schema/beans

...........
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

<import resource="classpath:app_dao.xml"/>

<bean id="txmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager">
<property name="datasource" ref="datasource"/>
</bean>


<bean id="userserviceimpltarget" class="com.service.impl.userserviceimpl">
<property name="userdao" ref="userjdbcdao"/>
</bean>

<!--应用tx/aop命名空间进行事务声明-->
<!--
tx:advice声明具体方法的事务属性,及应用到的事务管理器
-->
<tx:advice id="txadvice" transaction-manager="txmanager">
<tx:attributes>
<tx:method name="add*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!--
aop:config声明要进行事务增强的切面
-->
<aop:config>
<aop:pointcut id="servicemethod"
expression="execution(* com.service..add*(..))"/>
<aop:advisor pointcut-ref="servicemethod" advice-ref="txadvice"/>
</aop:config>
</beans>

测试:
.......
userservice usi = (userservice)ctx.getbean("userserviceimpltarget");
..........

3、使用@transactional注解配置声明事务(最简单实用的方法)

在需要事务管理增强的业务类加入@transactional注解标记,如:
......
import org.springframework.transaction.annotation.transactional; //
注解式事务

@transactional(readonly=false) //对业务类进行事务增强的标注
public class userserviceimpl implements userservice {
...........
}

再在配置文件中用<tx:annotation-driven>驱动自动为标记@transactional注解的类织入事务管理增强:
<import resource="classpath:app_dao.xml"/>

<bean id="txmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager">
<property name="datasource" ref="datasource"/>
</bean>

<!--注解式事务配置驱动-->
<tx:annotation-driven transaction-manager="txmanager" proxy-target-class="true"/>

<!--业务类bean的实现类标注了@transactional注解,所以会被
tx:annotation-driven
注解驱动自动织入事务增强-->
<bean id="userservice" class="com.service.impl.userserviceimpl">
<property name="userdao" ref="userjdbcdao"/>
</bean>

测试:
.........
userserviceimpl usi = (userserviceimpl)ctx.getbean("userservice");
.........

 

分享到:
评论

相关推荐

    Spring声明式事务处理

    Spring框架的声明式事务处理是Java企业级应用中不可或缺的一部分,它为开发者提供了一种方便、高效的方式来管理事务。在Spring中,事务管理分为编程式和声明式两种方式,而声明式事务处理则是通过配置来控制事务的...

    Spring事务管理4种方式

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

    Spring源代码解析(六):Spring声明式事务处理.doc

    Spring 中的事务处理可以分为两种方式:声明式事务处理和编程式事务处理。声明式事务处理通过 AOP 的实现,把事务管理代码作为方面封装到业务代码中,使得事务管理代码和业务代码解藕。这使得事务管理变得更加灵活...

    spring声明式事务处理demo

    首先,我们要理解Spring事务管理的两种主要方式:编程式事务管理和声明式事务管理。编程式事务管理通常通过AOP(面向切面编程)的TransactionTemplate或PlatformTransactionManager接口直接在代码中控制事务,而声明...

    spring3.0两种事务管理配置

    在 Spring 配置文件中,我们需要定义事务处理类,不同的数据访问方式,事务处理类不同,如 Hibernate 操作的 HibernateTransactionManager,JDBC 操作的使用 DataSourceTransactionManager。 接下来,我们需要定义...

    Spring2.0 事务处理

    总的来说,Spring 2.0的事务处理机制是其核心功能之一,它通过声明式和编程式的事务管理方式为开发者提供了极大的便利。理解并熟练掌握这些知识,对于构建健壮、高可用的企业级应用至关重要。通过`...

    spring事务配置的五种方式

    ### Spring事务配置的五种方式详解 #### 一、引言 在企业级应用开发中,事务处理是非常重要的一部分,特别是在涉及多个数据库操作时。Spring框架提供了强大的事务管理功能,支持编程式和声明式两种事务处理方式。...

    aop与spring事务处理

    #### 三、Spring事务处理 Spring 提供了一套强大的事务管理机制,它可以无缝地集成到现有的Java应用中。 1. **Spring事务管理的价值** - 对于传统的基于特定资源的事务处理(如基于JDBC的数据库访问),Spring...

    Spring事务原理、Spring事务配置的五种方式

    Spring事务原理是指Spring框架中的一种机制,用于管理事务,并提供了多种配置方式。事务是指一系列的操作,作为一个整体执行,如果其中某个操作失败,整个事务将回滚。Spring事务原理围绕着两个核心:...

    spring几种事务配置详解【精】

    这种方式直接在业务逻辑代码中嵌入事务处理,通常使用`PlatformTransactionManager`接口和`TransactionDefinition`接口。例如,通过`TransactionTemplate`或直接使用`TransactionStatus`进行事务管理。虽然灵活性高...

    spring整合hibernate实现事务处理

    本篇文章将详细探讨如何通过Spring整合Hibernate来实现事务处理,重点介绍注解方式和XML配置方式。 首先,我们了解事务处理在数据库操作中的重要性。事务是一组操作,这些操作要么全部成功,要么全部失败,确保数据...

    Spring事务管理Demo

    在Spring框架中,事务管理是核心特性之一,它允许开发者以声明式或编程式的方式处理应用中的事务。Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何...

    spring事务与数据库操作

    ### Spring事务与数据库操作 #### 一、Spring的声明式事务管理 在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。...

    Spring Data JPA系列4——Spring声明式事务处理与多数据源支持.doc

    Spring 声明式事务处理与多数据源支持 在大部分涉及到数据库操作的项目里面,事务控制、事务处理都是一个无法回避的问题。Spring 框架提供了声明式事务处理机制,使得业务代码中进行事务控制操作起来非常简单。只需...

    Spring事务流程图

    总的来说,Spring事务管理是一个强大的工具,它简化了事务处理的复杂性,使得开发者能够专注于业务逻辑,而无需过多关注事务的细节。通过理解和使用Spring事务流程图,我们可以更好地设计和优化我们的应用程序,确保...

    spring配置事务五种方式.doc

    这样,带有@Transactional注解的类或方法将会自动地被Spring事务代理处理。 3. **编程式事务管理** 编程式事务管理允许在代码中显式地开始、提交、回滚事务。使用PlatformTransactionManager接口的实现,如...

    spring声明式事务管理配置方式

    在Spring框架中,声明式事务管理是实现事务处理的一种高效且灵活的方式,它允许开发者通过在服务层方法上添加特定的注解来控制事务的边界,而无需编写大量的事务管理代码。这种方式使得业务逻辑和事务控制得以分离,...

    spring-tx事务管理实例

    首先,Spring事务管理分为编程式事务管理和声明式事务管理两种方式。编程式事务管理是通过调用TransactionTemplate或直接使用PlatformTransactionManager接口来控制事务的开始、提交和回滚。这种方式灵活,但侵入性...

    Spring事务优缺点及使用详解.docx

    三、Spring事务管理 Spring提供了一种统一的事务管理模型,它抽象出PlatformTransactionManager接口,简化了事务的处理。通过配置事务管理器(如DataSourceTransactionManager或HibernateTransactionManager),...

    Spring的事务配置的五种方式

    Spring框架在处理事务时提供了五种不同的配置方式,这些配置主要涉及到事务的声明式管理和编程式管理。在Spring中,事务管理通常分为三部分:DataSource、TransactionManager和代理机制。DataSource是数据源,...

Global site tag (gtag.js) - Google Analytics