Spring有几种事务处理方式

    技术2022-05-20  69

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


    最新回复(0)