一、事务的概述
事务首先是一系列操作组成的工作单元,该工作单元内的操作是不可分割的,即要么所以操作都做,要么所以操作都不做,这就是
事务。
事务必须满足ACID特性
1)原则性(Atomicity):即事务是不可分割的最小工作单元,事务要么全做,要么全不做
2)一致性(Consistency):一旦事务完成(不过成功还是失败),系统必须确保他所建模的业务处于一致的状态。显示的数据不应该
被损坏。
3)隔离性(Ioslated):并发事务执行之间无影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔
离性。
4)持久性(Durable):事务一旦执行成功,它对数据库的数据的改变必须是永久的。这样就能从任何的系统崩溃中恢复过来。
二、事务管理器
Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给JTA或其他持久化机制所提供的平台相关的事务
实现
Spring提供内置事务管理器的实现
事务的配置:
1)JDBC事务
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
注:dataSource为数据源
2)hibernate事务
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
注:sessionFactory为session工厂
3)JPA事务
<bean id="TxManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>
注:entityManagerFactory指定需要事务管理的Javax.persistence.EntityManagerFactory对象。还有为该对象指定jpaDialect属性,该属性所
对应的对象指定了如何获取连接对象、开启事务、关闭事务等事务管理相关行为。
三、 声明式事务
Spring对声明式事务的支持是通过spring AOP实现的
1、定义事务的属性:
1)传播行为:定义了客户端与调用方法直接的事务边界
2)隔离级别:定义了一个事务受其他事务影响的程度
3)是否只读:设置只读数据库可以对一些操作进行优化
4)事务超时:限定事务的时间
5)回滚原则:设置事务在遇到哪些异常时回滚
2、声明式事务管理的相关配置
1)在XML中定义相关的命名空间
注:之所以要用到AOP的命名空间,是因为声明式事务配置元素依赖于部分spring AOP的配置元素
2)配置事务
1) <tx:advice>:事务通知定义,用于指导事务属性,其中transaction-manager属性指定事务管理器
2)<tx:attributes>:指定具体拦截的方法
3)<tx:method>:用name属性指定方法,比如name=”save*”表示拦截以save开头的方法。其中method还有五个属性,propatation表
示传播行为、isolation表示隔离级别、read-only表示是否只读、timeout表示事物超时、no-rollbace-for表示回滚原则。其中属性
的具体值请看API。
3、定义通知器
<aop:pointcut>用于定义切点,experssion表示切入点表达式,我这里表示的是service包下的所以方法。
<aop:advisor>中pointcut-ref表示切入点,advice-ref表示事务。
这里,基于XML配置的声明式事务就完成了
4、基于注解声明事务
基于注解的声明式事务其实很简单,它不需要在配置文件中配置事务和通知器。只需要在配置文件中加入<context:annotation-
config/>表示启用注解,记得还有添加context的命名空间。<tx:annotation-driven transaction-manager="txManager"/>表示基于注解的事务
管理,transaction-manager值指向事务管理器。
接着,我们只需要在需要事务管理的bean或方法上加入@Transactional即可。@Transactional()括号里可指明事务的属性比如
@Transactional(isolation=Isolation.SERIALIZABLE)。
四、编程式事务
所谓的编程式事务就是通过编码方式实现事务
在配置文件中,只需配置事务管理器,并将配置管理器注入相应的bean中
在UseDao的代码:
1)UserDao继承了hibernateDaoSupport(不是重点)
2)这里setTransctionManager()以注入的TransactionManager作为参数,获取一个TransactionTemplate模板类。
3)TransactionTemplate用set*来设置事务的属性,例子中setPropagationBehavior就是用来设置传播行为。
4)TransactionTemplate有两个回调模板,一个是例子中使用的TransactionCallbackWithoutResult(),表示没返回值,另一TransactionCallback
(),表示有返回值。
5)TransactionTemplate通过execute来执行需要事务的回调