码迷,mamicode.com
首页 > 编程语言 > 详细

Spring实战笔记5---事务管理

时间:2014-09-18 14:56:24      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:bean   spring   java   aop   

事务管理(事务管理的规则式,在提交之前,如果修改数据库的话会真是改变,但是会留一个缓存,在事务出现错误的时候,会根据事务的配置做相应的回滚操作,在回滚操作式把还从当中的数据和数据库的数据做同步,修改数据库的操作不会发生在提交的时刻,估计是为了效率考虑的)


在软件开发领域,全有或者全无的操作被称为事务


用四个词来表示事务: 原子性 一致性 隔离性 持久性(事务完成,结果将会持久话,多半会涉及到数据库操作)



理解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>

Spring实战笔记5---事务管理

标签:bean   spring   java   aop   

原文地址:http://blog.csdn.net/u011374590/article/details/39370689

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!