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");
.........
发表评论
-
Spring MVC 工作流程
2011-05-31 17:57 15441、首先来配置一下DispatcherServlet: sp ... -
面向对象四大特征
2011-05-31 17:53 989计算机软件系统是现实生活中的业务在计算机中的映射,而现实生活中 ... -
Hibernate工作流程图
2011-05-31 17:48 2227如果只是单独的说一个Hibernate的流程主要分为以下八个步 ... -
Struts 2工作流程
2011-05-31 17:42 643Struts 2框架本身大致可以分为3个部分: 1. 核心控 ... -
Struts 1工作流程
2011-05-31 17:41 1605一个用户的请求是通ActionServlet来处理和转发的。那 ... -
SQL数据库优化的经验总结
2011-05-31 17:31 702[摘要] 缺省情况下建立 ... -
触发器的作用,什么时候用触发器,创建触发器的步骤,触发器里是否可以有commit, 为什么?
2011-05-31 17:06 1464触发器是可以由事件来启动运行的,存在于数据库服务器中的一个过程 ... -
Oracle各种版本之间的区别
2011-05-31 16:52 1450Oracle 9i比8i多了哪些新特性?简要说:9i更易于管理 ... -
数据库三大范式
2011-05-31 14:23 728数据库的建立必须遵循一定的规则。在关系数据库中,这种规则就是范 ... -
UML中对象关系及线条表示
2011-05-31 14:04 858一、继承下有两种关系: 1、一般化关系用 ... -
Struts1与Struts2的区别,它们常用到哪几个类, 以及工作流程?
2011-05-18 12:35 889常用到的类:Struts1:ActionServlet[pro ... -
ejb是基于哪些技术实现的?并说出sessionbean和entitybean的区别,statefulbean和statelessbean的区别
2011-05-18 11:29 807ejb包括session bean、entity bean、m ...
相关推荐
Spring事务管理4种方式 入门级 最简单demo PlatformTransactionManager TransactionTemplate
spring声明式事务处理demo。myeclipse工程
Spring源代码解析(六):Spring声明式事务处理.doc
spring整合hibernate实现事务处理 1.spring整合hibernate实现事务处理-注解方式 2.spring整合hibernate实现事务处理-XML方式
aop与spring事务处理
NULL 博文链接:https://babalaaaa.iteye.com/blog/538687
spring 事务处理
使用Spring Cloud微服务架构 阿里巴巴开源Seate处理分布式程序事务一致性问题demo 使用IDEA开发
这是在java里使用到spring的配置文件里,添加事务处理过程,以至于可以回滚事务,当中使用到拦截器。
Spring Hibernate 事务处理 详细说明 Spring Hibernate 事务处理 详细说明
spring boot 纯注解方法事务控制回滚,注解+简单配置文件使用多线程demo
spring-tx spring-transaction spring事务管理实例
事务简介 二、程序举例环境搭建 o1. 创建数据表 ...三、使用 Spring 的事务注解管理事务 o1. 声明事务管理器 o2. 开启注解驱动 o3. 完整Spring配置文件 o4. 业务层 public 方法加入事务属性 o5. 测试
NULL 博文链接:https://todd-liangt.iteye.com/blog/337274
Spring源代码解析(一):Spring中的事务处理 Spring源代码解析(二):ioc容器在Web容器中的启动 Spring源代码分析(三):Spring JDBC Spring源代码解析(四):Spring MVC Spring源代码解析(五):Spring AOP获取Proxy ...
需要使用Spring切面,同时需要保证事务正常。可使用文档中的方法。一般情况,若不做特殊处理。使用切面,事务将会失效。
spring声明式事务管理异常处理的测试
Spring延迟加载和声明式事务处理最终解决方案(修正版)
本文处理spring+mybatis,或springjdbc,对oracle事务不能提交的问题分析与解决
Spring Data JPA系列4——Spring声明式事务处理与多数据源支持.doc