首页 > 代码库 > Spring实战笔记5---事务管理

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

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


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


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



理解spring对事务管理的支持


spring通过回调机制将实际的事务实现从事务性代码中分离出来,spring支持编码式事务和声明式事务,编码式事务可以惊喜的控制事务,而声明式事务只支持在方法上添加事务


主要介绍声明式事务,编码式事务类似JDBC的数据模版,需要吧实际执行的代码包含在事务模版当中。


Spring的事务管理器


声明spring的事务管理器Bean的目的是告诉spring将会启动那种方式的事务管理模型,这里只说明基础的hibernate事务管理器


如果应用程序的持久话是通过hibernate实现的话,那么你需要使用

HibernateTransactionManager

我使用的是Hibernate4所以需要在spirng的应用上下文当中声明如下的bean


<bean id="transactionManager"

class="org.springframework.orm.hibernate4.HibernateTransactionManager">

<propertyname="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:methodname="add*"propagation="REQUIRED"/>

<tx:methodname="update*"propagation="REQUIRED"/>

<tx:methodname="delete*"propagation="REQUIRED"/>

<tx:methodname="*" 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---事务管理