javascript
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/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有几种事务处理方式?举例说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 沧州五中在哪个位置(沧州五中)
- 下一篇: asa(说一说asa的简介)