`
mrzhangtufu
  • 浏览: 61982 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Spring事务管理的三种简单方法

阅读更多

如有一代表用户的域对象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;
....//省略set、get方法
}

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、用原始的TransactionFactoryBean的app.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");
.........

1
0
分享到:
评论

相关推荐

    Spring事务管理Demo

    在压缩包中的Spring事务管理练习,你可以尝试创建一个简单的示例,例如模拟两个银行账户转账的过程,通过开启事务确保转账的原子性,即转账操作要么全部成功,要么全部失败。这样可以帮助你更好地理解Spring事务管理...

    Spring事务管理开发必备jar包

    2. **Spring事务管理**:Spring提供了两种事务管理方式,即编程式事务管理和声明式事务管理。编程式事务管理通过TransactionTemplate或直接调用PlatformTransactionManager接口的方法来管理事务,而声明式事务管理则...

    Spring事务管理的jar包

    Spring事务管理分为编程式事务管理和声明式事务管理两种方式。编程式事务管理通过使用PlatformTransactionManager接口的begin、commit、rollback等方法直接控制事务的生命周期,这种方式灵活但容易导致代码过于繁琐...

    spring 事务管理的理解

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

    Spring事务管理失效原因汇总

    除了异常外,方法的权限问题也会导致Spring事务管理失效。由于Java的继承机制,private、final、static修饰的方法不能被重写,因此这些方法不能被AOP代理。也就是说,这些修饰符的方法上不能直接使用@Transactional...

    spring事务管理

    Spring事务管理主要包括两种类型:编程式事务管理和声明式事务管理。 - **编程式事务管理**:通过编写代码来控制事务的开始、提交或回滚等操作。这种方式灵活度高,但会使得代码变得冗余且难以维护。 - **声明式...

    spring 自定义事务管理器,编程式事务,声明式事务@Transactional使用

    在Spring框架中,事务管理是核心功能之一,它确保了数据操作的一致性和完整性。本教程将深入探讨如何在Spring中实现自定义事务管理器...这将加深你对Spring事务管理的理解,帮助你在实际项目中更加熟练地运用这些技术。

    Spring的事务管理小案例

    在本文中,我们将深入探讨Spring框架中的事务管理。Spring是一个广泛应用的Java企业级应用开发框架,它提供...如果你想要深入了解,可以参考提供的博客链接或其他相关资料,进一步学习Spring事务管理的细节和最佳实践。

    spring事务与数据库操作

    Spring支持两种类型的事务管理:编程式事务管理和声明式事务管理。其中声明式事务管理因其易于使用和维护而被广泛采用。 ##### 1.1 Spring声明式事务介绍 Spring的声明式事务管理是通过配置文件或注解的方式来实现...

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

    你可以创建一个简单的 Spring 应用,配置事务管理器,并在业务层使用 @Transactional 注解或 TransactionTemplate 进行事务控制,以加深理解和应用。 总的来说,Spring 的事务管理机制提供了强大而灵活的支持,无论...

    Spring 事务简单完整例子

    本文将深入探讨在Spring框架中如何管理事务,以“Spring 事务简单完整例子”为出发点,结合标签“spring,事务,jdbc事务”,我们将详细解释Spring事务管理的原理和实践。 首先,Spring提供了两种事务管理方式:编程...

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

    Spring事务原理和配置 ...可是如果读者仔细研究了Spring事务管理的代码以后就会发现,事务管理其实也是如此简单的事情。这也印证了在本书开头,Spring事务管理的设计理念是:简洁、灵活、可扩展和可靠的。

    Spring自定义切面事务问题

    - **Spring 事务管理**:Spring 提供了两种事务管理方式:编程式事务管理和声明式事务管理。声明式事务管理通常更受欢迎,因为它可以通过简单的配置实现,而无需编写额外的代码。 2. **Spring 自定义切面事务失效...

    Spring事务管理的方法

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

    SPRING事务机制DEMO

    Spring事务管理提供了一种声明式的方式来控制事务边界,使得开发者无需显式地调用开始、提交或回滚事务。 在Spring中,有以下两种事务管理方式: 1. **编程式事务管理**:开发者需要手动调用`...

    spring_如何管理事务的

    #### 一、Spring事务管理概述 Spring框架为开发者提供了一套强大的事务管理机制,它简化了应用程序中的事务控制逻辑,使得开发人员能够更加专注于业务逻辑的编写,而不是繁琐的事务管理代码。Spring支持两种类型的...

    spring事务配置的五种方式

    ### Spring事务配置的五种方式详解 #### 一、引言 在企业级应用开发中,事务处理是非常重要...通过了解这五种配置方式,开发者可以根据项目的实际情况选择最合适的方法来实现事务管理,从而提高系统的稳定性和可靠性。

    spring事务管理.rar

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

    spring配置事务五种方式.doc

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

Global site tag (gtag.js) - Google Analytics