• 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");

  • 相关阅读:
    【codecombat】 试玩全攻略 第二章 边远地区的森林 一步错
    【codecombat】 试玩全攻略 第十八关 最后的kithman族
    【codecombat】 试玩全攻略 第二章 边远地区的森林 woodlang cubbies
    【codecombat】 试玩全攻略 第二章 边远地区的森林 羊肠小道
    【codecombat】 试玩全攻略 第十七关 混乱的梦境
    【codecombat】 试玩全攻略 第二章 边远地区的森林 林中的死亡回避
    【codecombat】 试玩全攻略 特别关:kithguard斗殴
    【codecombat】 试玩全攻略 第二章 边远地区的森林 森林保卫战
    【codecombat】 试玩全攻略 第二章 边远地区的森林
    实验3 类和对象||
  • 原文地址:https://www.cnblogs.com/soundcode/p/1910302.html
Copyright © 2020-2023  润新知