事务管理(事务管理的规则式,在提交之前,如果修改数据库的话会真是改变,但是会留一个缓存,在事务出现错误的时候,会根据事务的配置做相应的回滚操作,在回滚操作式把还从当中的数据和数据库的数据做同步,修改数据库的操作不会发生在提交的时刻,估计是为了效率考虑的)
在软件开发领域,全有或者全无的操作被称为事务
用四个词来表示事务: 原子性 一致性 隔离性 持久性(事务完成,结果将会持久话,多半会涉及到数据库操作)
理解spring对事务管理的支持
spring通过回调机制将实际的事务实现从事务性代码中分离出来,spring支持编码式事务和声明式事务,编码式事务可以惊喜的控制事务,而声明式事务只支持在方法上添加事务
主要介绍声明式事务,编码式事务类似JDBC的数据模版,需要吧实际执行的代码包含在事务模版当中。
Spring的事务管理器
声明spring的事务管理器Bean的目的是告诉spring将会启动那种方式的事务管理模型,这里只说明基础的hibernate事务管理器
如果应用程序的持久话是通过hibernate实现的话,那么你需要使用
HibernateTransactionManager
我使用的是Hibernate4所以需要在spirng的应用上下文当中声明如下的bean
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
这里需要一个SessionFactory当作事务管理器的入参
声明式事务
事务的属性: 传播行为(propagation) 隔离级别(isolation) 是否只读(read-only) 事务超时(timeout) 事务回滚(rollback-for no-rollback-for)
传播行为:
1. PROPAGATION_MANDATORY 表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常。
2. PROPAGATION_NESTED 表示当前如果已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前的事务进行单独的提交或者回滚。
3. PROPAGATION_NEVER 表示当前方法不应该运行在事务上下文中,如果当前正在有一个事务运行,则会抛出异常。
4. PROPAGATION_NOT_SUPPORTED 表示该方法不应该运行在事务当中,如果存在当前事务,在该方法运行期间,当前事务将被挂起。
5. PROPAGATION_REQUIRED 表示当前方法必须运行在事务中,如果当前事务存在,方法将会在该事务中运行,否则会启动一个新的事务。
6. PROPAGATION_REQUIRED_NEW 表示当前方法必须运行在他自己的事务当中,一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。
7. PROPAGATION_SUPPORTS 表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法将会在这个事务中运行
隔离级别:
1. ISOLATION_DEFAULT 使用后端数据库默认的隔离级别
2. ISOLATION_READ_UNCOMMITTED 允许读取尚未提交的数据变更。可能会导致脏读幻读或者不可重复读
3. ISOLATION_READ_COMMITTED 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或者不可重复读仍有可能发生
4. ISOLATION_REPEATABLE_READ 对同一字段的多次读取结果是一致的,除非数据是被本事务自己所修改
5. ISOLATION_SERIALIZABLE 完全服从ACID的隔离级别,确保阻止脏读,不可重复读和幻读
<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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
…
</beans>
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
同样也可以设置 isolation timeout rollback-for no-rollback-for 这些属性 但是rollback属性现在还不知道需要设置成生么样式,第一感觉应该是异常类的全称
定义事务的切点,注意AspectJ 的切点表达式中 “*” 后边要多加一个空格的
<aop:config>
<aop:pointcut id="user"
expression="execution(* com.newblog.DataResourceDao.UserDao.* (..))" />
<aop:pointcut id="blog"
expression="execution(* com.newblog.DataResourceDao.BlogDao.* (..))" />
<aop:pointcut id="comment"
expression="execution(* com.newblog.DataResourceDao.PictureDao.* (..))" />
<aop:pointcut id="picture"
expression="execution(* com.newblog.DataResourceDao.BlogDao.* (..))" />
<aop:advisor pointcut-ref="user" advice-ref="txAdvice" />
<aop:advisor pointcut-ref="blog" advice-ref="txAdvice" />
<aop:advisor pointcut-ref="comment" advice-ref="txAdvice" />
<aop:advisor pointcut-ref="picture" advice-ref="txAdvice" />
</aop:config>
原文地址:http://blog.csdn.net/u011374590/article/details/39370689