首先介绍一下事物的特性:ACID
1、原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2、一致性:指事务前后数据的完整性必须保持一致。
3、隔离性:指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离。
4、持久性:指一个事务一旦被提交,它对数据库中的数据的改变就是永久性的,即使数据库发生故障也不会其有任何影响。
然后介绍一下spring对事务的管理:(编程式事务+声明式事务)
spring事务管理高层抽象主要包括三个接口
Platform TransactionManager 事务管理器
Spring为不同的持久化框架提供了不同的接口实现:
使用Spring JDBC 或 iBatis进行持久化数据时使用DataSourceTransactionManager
使用Hibernate3.0进行持久化数据时使用HibernateTransactionManager
TransactionDefinition 事务定义信息(隔离、传播、超时、只读)
Mysql默认采用REPEATABLE_READ隔离级别;Oracle默认采用READ_COMMITTED隔离级别
TransactionStatus 事务具体运行状态
其次,介绍spring提供的事务控制方法:
1、编程式事务管理 ,利用TransactionTemplate将多个Dao操作封装起来
代码如下:
- <!-- 配置事务管理器 -->
- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource" />
- </bean>
- <!-- 配置事务管理的模板:Spring为了简化事务管理的代码而提供的类 -->
- <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
- <property name="transactionManager" ref="transactionManager"/>
- </bean>
- transactionTemplate.execute(new TransactionCallbackWithoutResult() {
- @Override
- protected void doInTransactionWithoutResult(
- TransactionStatus transactionStatus) {
- //处理业务代码
- }
- });
2、声明式事务管理(基于spring的AOP配置控制)
a、基于TransactionProxyFactoryBean的方式
需要为每个进行事务管理的类,配置一个TransactionProxyFactoryBean进行增强
- <!-- 配置业务层的代理 -->
- <bean id="userServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
- <!-- 配置目标对象 userService是注入事务的service层-->
- <property name="target" ref="userService" />
- <!-- 注入事务管理器 -->
- <property name="transactionManager" ref="transactionManager"></property>
- <!-- 注入事务的属性 -->
- <property name="transactionAttributes">
- <props>
- <!--key指需要事务的方法
- prop的格式:
- * PROPAGATION :事务的传播行为
- * ISOTATION :事务的隔离级别
- * readOnly :只读
- * -EXCEPTION :发生哪些异常回滚事务
- * +EXCEPTION :发生哪些异常不回滚事务
- -->
- <prop key="update">PROPAGATION_REQUIRED</prop>
- </props>
- </property>
- </bean>
使用是要用增强的代理类 userServiceProxy
b、基于xml配置 无需修改代码但需要引入aop声名和tx声名
- <!-- 配置事务的通知 -->
- <tx:advice id="txAdvice" transaction-manager="transactionManager">
- <tx:attributes>
- <!--
- propagation :事务传播行为
- isolation :事务的隔离级别
- read-only :只读
- rollback-for:发生哪些异常回滚
- no-rollback-for :发生哪些异常不回滚
- timeout :过期信息
- -->
- <tx:method name="update" propagation="REQUIRED"/>
- </tx:attributes>
- </tx:advice>
- <!-- 配置切面 -->
- <aop:config>
- <!-- 配置切入点 -->
- <aop:pointcut expression="execution(* com.*.UserService+.*(..))" id="pointcut"/>
- <!-- 配置切面 -->
- <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
- </aop:config>
c、基于注解
- <!-- 开启注解事务 -->
- <tx:annotation-driven transaction-manager="transactionManager"/>