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;
....//省略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");



本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2010/12/19/1910302.html,如需转载请自行联系原作者

目录
相关文章
|
3月前
|
XML Java 数据库连接
JAVAEE框架整合技术之spring03-SpringJdbcTemplate模板技术和事务处理
JAVAEE框架整合技术之spring03-SpringJdbcTemplate模板技术和事务处理
67 0
|
5月前
|
Java 数据库连接 API
Spring中的事务处理机制详解
Spring中的事务处理机制详解
138 0
|
6月前
|
XML Java Go
Spring事务管理: 构建稳健的数据库事务处理
Spring事务管理: 构建稳健的数据库事务处理
35 0
|
8月前
|
XML Java 数据库连接
2021-08-10基于注解配置AOP,银行取款初步后台搭建,spring事务处理,注解方式事务配置,spring+mybatis整合
2021-08-10基于注解配置AOP,银行取款初步后台搭建,spring事务处理,注解方式事务配置,spring+mybatis整合
340 1
|
XML 缓存 前端开发
别用 Filter 了,试试 Spring 自带的方式处理 CORS 跨域问题
从 CORS 到 Spring MVC 跨源资源共享(CORS) 即 Cross-Origin Resource Sharing,也常被译为跨域资源共享。作为 W3C 的标准,它允许浏览器向跨源服务器发起请求,克服了 AJAX 只能同源使用的限制。
393 0
别用 Filter 了,试试 Spring 自带的方式处理 CORS 跨域问题
|
Java Spring
Spring—Bean的装配方式—基于注解的七种装配方式
Spring—Bean的装配方式—基于注解的七种装配方式
128 0
|
资源调度 JavaScript Java
服务器支持访问静态文件的几种方式:Spring、Tomcat、Vue
服务器支持访问静态文件的几种方式:Spring、Tomcat、Vue
|
运维 Java 数据库连接
两种方式实现Spring 业务验证
验证在任何时候都非常关键。考虑将数据验证作为业务逻辑开发有利也有弊,Spring 认为,验证不应该只在Web 端进行处理,在服务端也要进行相应的处理,可以防止脏数据存入数据库中,从而避免为运维同学和测试同学造成更大的困扰,因为数据造成的bug会更加难以发现,而且开发人员关注点也不会放在数据本身的问题上,所以做服务端的验证也是非常有必要的。考虑到上面这些问题,Spring 提供了两种主要类型的验证:
292 0
|
Java Spring
spring创建Bean的9种方式,你用过几种?
spring创建Bean的9种方式,你用过几种?
220 0
|
Java 数据库连接 Spring
Spring整合Mybatis,SqlSessionDaoSupport方式
SqlSessionDaoSupport 是一个抽象的支持类,用来为你提供 SqlSession。调用 getSqlSession() 方法你会得到一个 SqlSessionTemplate🙌 接口实现类:(此类继承SqlSessionDaoSupport即可)
192 2