1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Spring有几种事务处理方式?举例说明

Spring有几种事务处理方式?举例说明

时间:2023-03-04 03:32:44

相关推荐

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="mons.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="/schema/tx"

xsp:schemalocation="/schema/beans

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。