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/txhttp://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有几种事务处理方式?举例说明相关推荐

  1. Java框架篇---spring aop两种配置方式

    Java框架篇---spring aop两种配置方式 第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步:  1. 使用注解@Aspect来定义一个切面,在切面中 ...

  2. Spring的四种注入方式

    Spring的四种注入方式 1.set方法注入 2.构造器注入 3.静态工厂注入 4.实例工厂注入 我使用下面两个类来进行注入的演示,这两个类分别是User和Car类: Car类: public cl ...

  3. Spring的三种注入方式(为什么推荐构造器注入?)

    Spring的三种注入方式 一.属性注入 @Resource和@Autowired的区别 为什么尽量使用 @Resource? 二.setter 注入 三.构造器注入 具体可以看看Spring官网 为 ...

  4. Linq to Sql : 三种事务处理方式

    Linq to SQL支持三种事务处理模型:显式本地事务.显式可分发事务.隐式事务.(from  MSDN: 事务 (LINQ to SQL)).MSDN中描述得相对比较粗狂,下面就结合实例来对此进行 ...

  5. Spring AOP两种使用方式以及如何使用解析

    AOP是一种面向切面编程思想,也是面向对象设计(OOP)的一种延伸. 在Spring实现AOP有两种实现方式,一种是采用JDK动态代理实现,另外一种就是采用CGLIB代理实现,Spring是如何实现的 ...

  6. Spring的两种代理方式:JDK动态代理和CGLIB动态代理

    代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为"代理",所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者 ...

  7. 扯一把 Spring 的三种注入方式,到底哪种注入方式最佳?

    循环依赖这个问题,按理说我们在日常的程序设计中应该避免,其实这个本来也是能够避免的.不过由于总总原因,我们可能还是会遇到一些循环依赖的问题,特别是在面试的过程中,面试考察循环依赖,主要是想考察候选人对 ...

  8. Spring 的三种注入方式?

    1. 实例的注入方式 首先来看看 Spring 中的实例该如何注入,总结起来,无非三种: 属性注入 set 方法注入 构造方法注入 我们分别来看下. 1.1 属性注入 属性注入是大家最为常见也是使用最 ...

  9. Spring 的三种注入方式,到底哪种注入方式最佳?

    1. 实例的注入方式 首先来看看 Spring 中的实例该如何注入,总结起来,无非三种: 属性注入 set 方法注入 构造方法注入 我们分别来看下. 1.1 属性注入 属性注入是大家最为常见也是使用最 ...

最新文章

  1. 浩方平台CS流量评估
  2. linux图形模式切换用户,Linux的图形模式和文本模式以及单用户模式切换
  3. Windows下安装苹果iPhone开发环境xcode图文教程
  4. restful-api-design-references
  5. 感量越大抑制频率约低_脉冲信号是什么?它与频率,占空比,正、负逻辑间是什么关系?...
  6. 下拉框_jQuery 美化界面的下拉框
  7. 基于ELK的简单数据分析
  8. RSA 数字签名算法(Java版)
  9. Delphi 的绘图功能[9] - TextRect
  10. 十二.激光SLAM框架学习之livox-loam框架安装和跑数据集
  11. 【二、玩转vim(vi)编辑器】三大模式及命令介绍、如何通过配置文件.vimrc配置vim编辑器
  12. Esri官网购买个人版ArcGIS Pro激活方法
  13. windows无法访问 计算机打印机,windows 7 无法连接到打印机 (错误0x0000000d)的解决方法...
  14. QQ互联官网使用跳坑
  15. Starbound正式版的Mod制作(一)nbsp;…
  16. 6.6.5 住房公积金参缴记录
  17. 解决“我们注意到您的计算机目前处于离线状态。您需要连接网络以使用EA”
  18. vue3 注册全局方法 定义全局方法
  19. ar8161网卡 linux,解决AR8161网卡驱动的方法
  20. 小学生学计算机,学计算机对小学生的好处

热门文章

  1. knn人脸识别判断_测试使用K-最近邻(kNN)算法的30个问题
  2. python数据库教程_Python连接mysql数据库及简单增删改查操作示例代码
  3. redis java客户端配置,Java的Redis客户端选择-jedis与Lettuce
  4. Scala Actor,receive不断接收消息,react复用线程,结合case class的actor,Future使用,使用Actor进行wordCount
  5. findbugs, checkstyle, pmd的myeclipse7.5+插件安装(转:http://blog.csdn.net/priestmoon/article/details/63941)
  6. CXF客户端配置请求超时限制
  7. TopLink JPA
  8. 窗口分析函数_6_计算累加差
  9. mysql 小类型_mysql 数据类型
  10. 图像锐化算法(Image sharpening):拉普拉斯增强和Unsharp Masking(附代码)