- 浏览: 750836 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
di1984HIT:
哈哈,都不错。
Linux 环境下SQLPLUS 回退键无法使用处理方法 -
di1984HIT:
还可以查到sql
oracle中查询被锁的表并释放session -
di1984HIT:
呵呵,真的不错。
Oracle数据库经常会遇到CPU利用率很高的情况 -
李君寻:
...
解读java连接db2的四种类型 -
清风123:
dx>=this.length
js删除Array数组中的某个元素
数据库事务的4个特性:
原子性(atomic): 都成功或者都失败;
一致性(consistency):事务操作之后,数据库所处的状态和业务规则是一致的;比如a,b账户相互转账之后,总金额不变;
隔离性(isolation):操作中的事务不相互影响;
持久性(durability):事务提交后被持久化到数据库.
数据并发产生的问题:
脏读:一个事物a读到了另一个事务b未提交的数据,则b回滚后,a读取的数据无效;
不可重复读:一个事物a第二次读到了另一个事务b修改的数据;
幻读:在统计数据的事务a两次统计的数据不一致(因为有其他事务新增数据)
第一类丢失更新:a事务回滚覆盖了b事务提交的数据;
第二类丢失更新:a事务覆盖了b事务提交的数据.
事物隔离级别: READ_UNCOMMITED, READ_COMMITED, REPEATABLE_READ, SERIALIZABLE; 一般情况下READ_COMMITED足够了.
spring事务管理相关的接口:
TransactionDefinition:代表一个事物,描述了事务的隔离级别, 超时时间,事务是否只读, 传播规则等等;
TransactionStatus:描述事物的状态;
PlatformTransactionManager:事务管理器接口, 只定义了3个方法:getTransaction()获取事务的状态; commit();rollback();
事务管理器的实现类有多种,根据具体的持久层框架的不同而不同;
spring中的事务传播行为的种类:
PROPAGATION_REQUIRED: 如果当前没有事务,就创建一个事务;如果已经存在事务,则加入事务;
PROPAGATION_SUPPORTS: 如果已经存在事务,则加入事务;如果没有事务,则以非事务的方式执行;
PROPAGATION_MANDATORY: 使用当前事务, 如果没有, 则抛出异常;
PROPAGATION_REQUIRED_NEW: 新建事务,如果当前有事务, 则挂起;
PROPAGATION_NOT_SUPPORTED:以非事务的方式执行, 如果当前有事务, 则挂起;
PROPAGATION_NEVER:以非事务的方式执行, 如果当前有事务,则抛出异常;
使用spring声明式的事务管理:
大多数情况下,事务会放在services层,spring声明式的事务管理中,需要做以下的工作:
1 把dao,service注入到spring容器(这些dao, service不涉及事务);
2 需要注入一个transactionManager(它需要dataSource);
3 通过TransactionProxyFactoryBean为目标对象(需要事务的dao, service等等)提供事务增强,产生增强后的代理对象.
看代码:
先添加一个CompanyService,
view plaincopy to clipboardprint?
package services;
import java.util.List;
import model.Company;
import dao.hibernate.CompanyDao;
public class CompanyService {
private CompanyDao companyDao;
public CompanyDao getCompanyDao() {
return companyDao;
}
public void setCompanyDao(CompanyDao companyDao) {
this.companyDao = companyDao;
}
public void insertCompany(Company c){
//some security check
companyDao.save(c);
//some updates
}
public void deleteCompany(int id){
//some security check
companyDao.deleteById(id);
// some updates
}
public void updateCompany(Company c){
companyDao.save(c);
}
public List list(){
return companyDao.list();
}
}
package services;
import java.util.List;
import model.Company;
import dao.hibernate.CompanyDao;
public class CompanyService {
private CompanyDao companyDao;
public CompanyDao getCompanyDao() {
return companyDao;
}
public void setCompanyDao(CompanyDao companyDao) {
this.companyDao = companyDao;
}
public void insertCompany(Company c){
//some security check
companyDao.save(c);
//some updates
}
public void deleteCompany(int id){
//some security check
companyDao.deleteById(id);
// some updates
}
public void updateCompany(Company c){
companyDao.save(c);
}
public List list(){
return companyDao.list();
}
}
它调用dao组件执行crud.事务控制一般都放在这一层.
spring事务管理第一种配置方式:为每个目标bean配置一个代理
view plaincopy to clipboardprint?
<bean id="companyDao" class="dao.hibernate.CompanyDaoImpl">
<property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>
<!-- 需要被增强的bean通常命名为xxxxTarget -->
<bean id="companyServiceTarget" class="services.CompanyService">
<property name="companyDao" ref="companyDao" />
</bean>
<!-- 事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 被代理之后的service,它具有事务功能,程序中我们就使用它 -->
<bean id="companyService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 事务管理器 -->
<property name="transactionManager" ref="txManager" />
<!-- 需要被代理的目标 -->
<property name="target" ref="companyServiceTarget" />
<!-- optimize可选,true代表使用CGLib, false代表使用jdk proxy -->
<property name="optimize" value="true" />
<!-- 事务属性, 顺序: PROPAGATION, ISOLATION, readOnly, -Exceptions, +Exceptions -->
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="list">PROPAGATION_REQUIRED, readOnly</prop>
<prop key="search*">PROPAGATION_REQUIRED, readOnly</prop>
</props>
</property>
</bean>
<bean id="companyDao" class="dao.hibernate.CompanyDaoImpl">
<property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>
<!-- 需要被增强的bean通常命名为xxxxTarget -->
<bean id="companyServiceTarget" class="services.CompanyService">
<property name="companyDao" ref="companyDao" />
</bean>
<!-- 事务管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 被代理之后的service,它具有事务功能,程序中我们就使用它 -->
<bean id="companyService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 事务管理器 -->
<property name="transactionManager" ref="txManager" />
<!-- 需要被代理的目标 -->
<property name="target" ref="companyServiceTarget" />
<!-- optimize可选,true代表使用CGLib, false代表使用jdk proxy -->
<property name="optimize" value="true" />
<!-- 事务属性, 顺序: PROPAGATION, ISOLATION, readOnly, -Exceptions, +Exceptions -->
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="list">PROPAGATION_REQUIRED, readOnly</prop>
<prop key="search*">PROPAGATION_REQUIRED, readOnly</prop>
</props>
</property>
</bean>
测试:
view plaincopy to clipboardprint?
public class Test {
public static void main(String[] args) throws InterruptedException, SQLException{
ApplicationContext c = new ClassPathXmlApplicationContext("spring-test.xml");
CompanyService s = (CompanyService)c.getBean("companyService");
List list = s.list();
System.out.println(list.size());
s.insertCompany(new Company("www.ddd.com","ddd","wuhan", new Date()));
}}
public class Test {
public static void main(String[] args) throws InterruptedException, SQLException{
ApplicationContext c = new ClassPathXmlApplicationContext("spring-test.xml");
CompanyService s = (CompanyService)c.getBean("companyService");
List list = s.list();
System.out.println(list.size());
s.insertCompany(new Company("www.ddd.com","ddd","wuhan", new Date()));
}}
你会发现,这里的配置和前面讲的spring aop多么的相同,不错,他们的原理都是一样的,如果你没有了解过spring aop, 建议看一下。
通常情况下,service层需要的事务控制的配置大都相同,而且方法名大都是insertXXX, updateXXX, deleteXXX, searchXXX, checkXXX诸如此类,所以我们可以配置一个可复用的事务代理:
spring事务管理第二种配置方式:目标bean共享代理基类
view plaincopy to clipboardprint?
<!-- abstract="true"标明它是抽象的 -->
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
<property name="transactionManager" ref="txManager" />
<!-- target被注释掉 -->
<!--property name="target" ref="companyServiceTarget" /-->
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="list">PROPAGATION_REQUIRED, readOnly</prop>
<prop key="search*">PROPAGATION_REQUIRED, readOnly</prop>
</props>
</property>
</bean>
<bean id="companyService" parent="baseTransactionProxy">
<property name="target" ref="companyServiceTarget" />
</bean>
<bean id="otherService" parent="baseTransactionProxy">
<property name="target" ref="otherServiceTarget" />
</bean>
......
<!-- abstract="true"标明它是抽象的 -->
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
<property name="transactionManager" ref="txManager" />
<!-- target被注释掉 -->
<!--property name="target" ref="companyServiceTarget" /-->
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="list">PROPAGATION_REQUIRED, readOnly</prop>
<prop key="search*">PROPAGATION_REQUIRED, readOnly</prop>
</props>
</property>
</bean>
<bean id="companyService" parent="baseTransactionProxy">
<property name="target" ref="companyServiceTarget" />
</bean>
<bean id="otherService" parent="baseTransactionProxy">
<property name="target" ref="otherServiceTarget" />
</bean>
......
虽然我们为需要事务增强的bean配置了代理类,但是难保用户还会直接使用目标对象companyServiceTarget; 可以使用拦截器.
spring事务管理第三种配置方式:使用拦截器
view plaincopy to clipboardprint?
<!-- 配置一个事务拦截器,他对目标对象有事务增强的作用 -->
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="txManager" />
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- 为目标对象自动创建代理 -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>companyServiceTarget</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
<!-- 配置一个事务拦截器,他对目标对象有事务增强的作用 -->
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="txManager" />
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- 为目标对象自动创建代理 -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>companyServiceTarget</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
测试:此时可以直接使用companyServiceTarget.
view plaincopy to clipboardprint?
public class Test {
public static void main(String[] args) throws InterruptedException, SQLException{
ApplicationContext c = new ClassPathXmlApplicationContext("spring-test.xml");
//直接使用目标对象
CompanyService s = (CompanyService)c.getBean("companyServiceTarget");
List list = s.list();
System.out.println(list.size());
s.insertCompany(new Company("www.ddd.com","ddd","wuhan", new Date()));
}}
public class Test {
public static void main(String[] args) throws InterruptedException, SQLException{
ApplicationContext c = new ClassPathXmlApplicationContext("spring-test.xml");
//直接使用目标对象
CompanyService s = (CompanyService)c.getBean("companyServiceTarget");
List list = s.list();
System.out.println(list.size());
s.insertCompany(new Company("www.ddd.com","ddd","wuhan", new Date()));
}}
spring事务管理第四种配置方式:使用tx命名空间
view plaincopy to clipboardprint?
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="list" propagation="REQUIRED" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="interceptorPointCuts"
expression="execution(* services.*Service(..))" />
<aop:advisor advice-ref="txAdvice"
pointcut-ref="interceptorPointCuts" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="list" propagation="REQUIRED" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="interceptorPointCuts"
expression="execution(* services.*Service(..))" />
<aop:advisor advice-ref="txAdvice"
pointcut-ref="interceptorPointCuts" />
</aop:config>
但是这种配置就需要把tx, aop的命名空间加入进来了:臭长臭长的。
view plaincopy to clipboardprint?
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
......
</beans>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
......
</beans>
spring事务管理第五种配置方式:注解
略...
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sunxing007/archive/2009/09/22/4579225.aspx
发表评论
-
Ant开发及整合应用详解
2010-08-11 23:09 3564在Ant工具中每一个任务封装了具体要执行的功能,是Ant工具的 ... -
myeclipse 不能关闭tomcat导致启动时出现Address already in use: JVM_Bind:8080
2009-08-05 23:17 3614Address already in use: JVM_Bin ... -
配置 Yale CAS Server 来实现单点登陆(SSO)
2009-05-07 15:21 1937一、配置tomcat的ssl 1、生成 name key ... -
javamail发送邮件验证时的异常?
2009-04-23 16:18 2860今天写了一段javamail程序并注册sina的免费油箱来测试 ... -
关于javamail与j2ee5的冲突
2009-04-23 16:08 1514在一个javamail-1.4.1,把其中的mail包导入,异 ... -
java中线性表,链表,哈希表是常用的数据结构
2009-03-03 11:03 2577线性表,链表,哈希表 ... -
Set接口与Map接口的区别
2009-03-03 10:52 2001Set接口 Set是一种不包含重复的元素的Coll ... -
struts与spring三种整合方法
2008-08-18 20:23 1534struts与spring三种整合方法 <!-- 载入 ... -
java中对像与字节数据之间的转化
2008-03-28 16:19 13861、对像变成字节数组 ByteArray ... -
Spring的Beanfactory在jsp,servlet,web.xml等的配置
2008-03-12 10:17 3570在web application 调用Spring的Beanf ...
相关推荐
spring学习笔记事务的
Spring.NET事务管理机制 原文:http://www.cnblogs.com/GoodHelper/archive/2009/11/16/SpringNet_Transaction.html
(三) XML文件形式配置Spring事务管理 37 四、 HibernateTemplate 38 (一) HibernateTemplate 38 (二) HibernateDaoSupport 39 第十一课:Spring整合-SSH 40 一、 第一步:加入jar包(需要的jar包列表) 40 二、 第二步...
full-stack 轻量级开源框架,以 IoC(Inverse Of Control: 反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业...
Spring.NET事务配置模板。 原文出处:http://www.cnblogs.com/GoodHelper/archive/2009/11/16/SpringNet_Transaction.html
NULL 博文链接:https://microjava.iteye.com/blog/525981
Spring入门学习笔记,内容包括Spring介绍,Spring配置文件,Spring配置数据源,Spring的注解开发,Spring集成Junit,Spring的AOP,jdbcTemplate介绍,Spring控制事务流程,Spring集成web。
NULL 博文链接:https://microjava.iteye.com/blog/525973
spring学习笔记脑图,简单理解aop ioc 事务管理,和spring的基本结构以及底层原理所用到的设计模式
(三) XML文件形式配置Spring事务管理 37 四、 HibernateTemplate 38 (一) HibernateTemplate 38 (二) HibernateDaoSupport 39 第十一课:Spring整合-SSH 40 一、 第一步:加入jar包(需要的jar包列表) 40 二、 第二步...
声明式事务控制Spring提供对事务的控制管注解方式事务属性事务传播为如果当前方法有事务,当前方法事务会挂起,在为加入的方法开启一个新的事务,直到新的事务执完、
NULL 博文链接:https://vzhchv0010.iteye.com/blog/356142
Spring框架的学习笔记,包括了springIOC,spirng注入,springAoP,SpringJdbc模板的使用,Spring声明式事务。
容器(spring):管理dao,service,action,...包含并管理应用对象的生命周期和配置 框架:使用组件配置组合成复杂的应用,并提供很多基础功能 Spring提供了对开源社区中很多框架及JavaEE中很多技术的支持,让程序员很...
Spring 的核心是个轻量级(Lightweight)的容器(Container),它是实现IoC(Inversion of Control)容器、非侵入性(No intrusive)的框架,并提供AOP(Aspect-oriented programming)概念的实现方式,提供对...
NULL 博文链接:https://coolszy.iteye.com/blog/542717
struts与hibernate集成原理,基础知识补充AOP,编程式事务,声明式事务,spring注入学习笔记
NULL 博文链接:https://coolszy.iteye.com/blog/542781
基于 Spring2.5.6 包含Spring2.5中的信赖注入、AOP、事务管理等较全面的内部。
非常详细的Spring框架其中包括Spring关于IOC、DI、AOP 和事务的相关模块。仅供参考。