Spring的事务管理
来源:互联网 发布:淘宝直通车有效果吗 编辑:程序博客网 时间:2024/06/05 18:59
毕业也快俩个月了,作为应届毕业生深感工作不易,之前在学校学到的只是皮毛,要想前途敞亮点还是要不断的学习。之前也有用过Spring的事务管理,没有深刻的去理解,这几天做项目又有涉及,决定搞懂它。这里将对Spring事务管理做指导性的介绍,想了解具体细节还要仔细的去阅读下书籍。推荐《Spring in Action》。
事务管理简洁的解释就是:确保数据和资源不会处于一种不一致的状态。没有事务管理就可能出现数据被破坏,应用程序中的业务规则缺乏一致性。
可以用4个词来解释事务。
1、原子性:事务有一个或多个行为捆绑在一起,好像一个单独工作单元。原子性确保所有操作要么都成功,要么都不发生。都成功则提交,否则回滚。
2、一致性:一旦事务结束,系统所处状态和它业务规则保持一致,即数据不会被破坏。
3、隔离性:事务允许多个用户操作一个数据库,但一个用户的操作不会和其他用户的操作混淆。
4、持久性:一旦事务完成,事务的结果应该持久化,不管什么样的系统崩溃它们都要幸免于难。
Sping不直接管理事务,它提供许多可供选择的事务管理器,将事务管理委托给这些事务管理器,这些事务管理器管理着对应的事务。
而我们常见的事务有一下几种:JDBC事务、Hibernate事务、JPA事务、JDO事务、JTA事务等。
Spring对事务管理的支持一般有两种方式:程序控制事务管理和声明式事务管理。这里只介绍最常用也是很方便的声明式事务管理。
(以下涉及的专业名词的具体含义需要认真理解,这里只提名字,不做解释)
声明式事务管理是用事务参数来定义的,一个事务参数有5方面组成:propagation(传播行为)、isolation(隔离级别)、rollback rules(回滚规则)、time out(事务超时)、read only(只读)
propagation:传播行为定义关于客户端和被调用方法的事务边界。Spring有7种截然不同的传播行为:(1)PROPAGATION_MANDATORY (2)PROPAGATION_NESTED (3)PROPAGATION_NEVER (4)PROPAGATION_NOT_SUPPORTED (5)PROPAGATION_REQUIRED (6)PROPAGATION_REQUIRES_NEW (7)PROPAGATION_SUPPORTS
isolation:定义一个事务可能被其他并发事务活动影响的程度。(1)ISOLATION_DEFAULT (2)ISOLATION_READ_UNCOMMMITTED (3)ISOLATION_READ_COMMITTED (4)
ISOLATION_REPEATABLE_READ (5)ISOLATION_SERIALIZABLE
read only:是否是一个只读事务。
time out:为减少不必要的占用数据库资源的情况,限制事务在运行特定时间后自动回滚。
rollback rules:定义哪些异常引起回滚,哪些不引起回滚。
下面是Spring2.0之后的声明式事务管理的实例:
1、引入新配置元素和spring-tx.xsd模式(aop空间也要包括在内)
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
2、书写XML配置元素
<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="tx*" propagation="REQUIRED" /><tx:method name="save*" propagation="REQUIRED" /><tx:method name="update*" propagation="REQUIRED" /><tx:method name="delete*" propagation="REQUIRED" /><tx:method name="*" propagation="REQUIRED" read-only="true"/> </tx:attributes> </tx:advice>
事务参数在一个<tx:attributes>中定义,它包含一个或多个<tx:method>元素,这个<tx:method>为由name参数指定的方法定义事务参数(如蓝体字部分)。事务参数就是上面所提到的5种,共6个方面:(1)isolation(2)no-rollback-for(3)propagation(4)read-only(5)rollback-for(6)timeout
在使用<tx:advice>声明一个事务时需要一个事务管理器,如2中红色字体所示。下面是hibernate3的事务管理器实例:
<!-- 定义事务管理器(声明式的事务) --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean>
3、完整的事务性切面。
<tx:advice>只主动定义一个AOP通知(advice),用于把事务边界通知给方法,但这只是事务通知,不是一个完全的事务性切面。我们没有在<tx:advice>中指出哪些bean应该被通知,我们需要一个用于该工作的切入点(pointcut),为了完整的定义这个事务切面,我们还要定一个通知器(advisor),这时就涉及到aop空间了。实例如下:
<aop:config> <aop:pointcut id="interceptorPointCuts" expression="execution(* com.shhy.debit.*.service.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" /> </aop:config>
例子中的通知器定义通知service包下所有的service中的方法。
经过如上三步就配置好了一个Spring事务管理。
此笔记用于个人知识梳理,如有出错之处还望指出,在此谢过。
- Spring , Spring的事务管理
- Spring事务管理一:Spring事务管理的优点
- spring提供的事务管理
- spring 的事务管理
- spring的事务管理方式!
- spring框架的事务管理
- spring的事务管理问题
- Spring框架的事务管理
- Spring 事务管理的配置
- 关于spring 的事务管理
- Spring的事务管理
- spring的事务管理
- Spring事务管理的改进
- Spring的事务管理
- 配置spring的事务管理
- Spring 的事务管理
- spring事务管理的种类
- Spring的事务管理
- HIT 2275 Number sequence
- 软件规模度量LOC Vs FP
- LeetCode-Minimum Depth of Binary Tree
- Calendar获取月第一天,最后一天
- 为什么要使用线程池?
- Spring的事务管理
- JVM调优总结(六) 分代垃圾回收详述-2
- JAVA_WEB Oracle 10g学习:Oracle 数据类型
- MySql常用命令大全
- TOJ 1840 POJ 1127 HDU 1102 Jack Straws / 线段相交 + 并查集
- 循序加解密
- 2013-8-16 C++判断文件是否存在
- Hadoop 集群配置
- 串口RS-232 有时为什么要使用交叉线