Spring事务管理:
Spring事务管理高层抽象主要包括3个接口
(1)PlatformTransactionMannager事务管理器(提交,回滚等)
(2)TransactionDefinition事务定义信息(隔离,传播,超时,只读)
(3)TransactionStatus 事务具体运行状态
一、PlatformTransactionMannager事务管理器
spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现
例如:使用spring JDBC或mybatis 进行持久化数据时使用:DataSoourceTransactionManager
使用Hibernate3.0版本进行持久化数据时使用:HibernateTransactionManager
二、TransactionDefinition事务定义信息
脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据是无效的
不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。
幻读:一个事务读取了几行记录后,另一个事务插入一些记录,幻读就产生了
事务隔离级别:
READ_UNCOMMITED 允许读取还未提交的改变了的数据,可导致脏、幻、不可重复读
READ_COMMITTED 允许在并发事务已经提交后读取。可防止脏读,但幻读,不可重复读仍可导致
REPEATABLE_READ 对相同字段的多次读取是一致的,除非数据被事务本身改变,可防止脏、不可重复读,但幻读可能发生
SERIALIZABLE 完全服从ACID的隔离级别,确保不发生脏、幻、不可重复读。这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中设计的数据表来完成的。
事物的传播行为:解决业务层之间的互相调用问题(主要介绍三种)
PROPAGATION_REQUIRED 支持当前事务,如果不存在就新建一个
PROPAGATION_REQUIRES_NEW 如果有事物存在,挂起当前事务,创建一个新的事务
PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行
三、TransactionStatus 事务具体运行状态
里面定义了一些方法里进行判断当前事务。例如:
hasSavepoint()是否有保存点
isCompleted()是否已经完成
isNewTransaction()是否是一个新的事务
Spring支持两种方式的事务管理
1.编程式的事务管理
2.使用XML配置声明式事务
Spring的声明式事务是通过AOP实现的
方式一:基于TransactionProxyFactoryBean代理 实现事务
方式三:基于AspectJ的注解方式事务管理
Spring事务管理高层抽象主要包括3个接口
(1)PlatformTransactionMannager事务管理器(提交,回滚等)
(2)TransactionDefinition事务定义信息(隔离,传播,超时,只读)
(3)TransactionStatus 事务具体运行状态
一、PlatformTransactionMannager事务管理器
spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现
例如:使用spring JDBC或mybatis 进行持久化数据时使用:DataSoourceTransactionManager
使用Hibernate3.0版本进行持久化数据时使用:HibernateTransactionManager
二、TransactionDefinition事务定义信息
脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据是无效的
不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。
幻读:一个事务读取了几行记录后,另一个事务插入一些记录,幻读就产生了
事务隔离级别:
READ_UNCOMMITED 允许读取还未提交的改变了的数据,可导致脏、幻、不可重复读
READ_COMMITTED 允许在并发事务已经提交后读取。可防止脏读,但幻读,不可重复读仍可导致
REPEATABLE_READ 对相同字段的多次读取是一致的,除非数据被事务本身改变,可防止脏、不可重复读,但幻读可能发生
SERIALIZABLE 完全服从ACID的隔离级别,确保不发生脏、幻、不可重复读。这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中设计的数据表来完成的。
事物的传播行为:解决业务层之间的互相调用问题(主要介绍三种)
PROPAGATION_REQUIRED 支持当前事务,如果不存在就新建一个
PROPAGATION_REQUIRES_NEW 如果有事物存在,挂起当前事务,创建一个新的事务
PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行
三、TransactionStatus 事务具体运行状态
里面定义了一些方法里进行判断当前事务。例如:
hasSavepoint()是否有保存点
isCompleted()是否已经完成
isNewTransaction()是否是一个新的事务
Spring支持两种方式的事务管理
1.编程式的事务管理
通过TransactionTemplate手动管理事务(实际中很少用)
<!-- 事务模板 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"/>
</bean>
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 在service层使用事务模板 -->
<bean id="accontServiceImpl" class="cn.edu.sdut.service.impl.AccontServiceImpl">
<property name="accountDao" ref="accountDaoImpl"></property>
<property name="transactionTemplate" ref="transactionTemplate"/>
</bean>
//业务方法
public void transfer(final String out, final String in, final Double money) {
transactionTemplate.execute(new TransactionCallbackWithoutResult(){
@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
accountDao.inMoney(in, money);
accountDao.outMoney(out, money);
}});
}
2.使用XML配置声明式事务
Spring的声明式事务是通过AOP实现的
方式一:基于TransactionProxyFactoryBean代理 实现事务
<bean id="transactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 事务管理 -->
<property name="transactionManager" ref="transactionManager"/>
<!-- 代理对象-->
<property name="target" ref="accountServiceImpl2"/>
<!-- 设置事务参数 -->
<property name="transactionAttributes">
<props>
<!--prop 格式:
PROPAGATION : 事物的传播行为
ISOLATION : 事务的隔离级别
readOnly :只读(不可以进行修改的)
-Exception :发生哪些异常回滚事务
+Exception :发生哪些异常事务不回滚
-->
<prop key="transfer">PROPAGATION_REQUIRED</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
方式二:基于AspectJ的XML方式事务管理
<!-- 配置事务通知(事务的增强) -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--
propagation:事物的传播行为
isolation:事物的隔离级别
read-only:只读
rollback-for:发生哪些异常回滚
no-rollback-for:发生那些异常不回滚
timeout : 超时期限
-->
<tx:method name="transfer" propagation="REQUIRED" isolation="DEFAULT" read-only="false" timeout="-1"/>
</tx:attributes>
</tx:advice>
<!-- 配置切面 -->
<aop:config>
<aop:pointcut expression="execution(* cn.edu.sdut.service.impl.AccountServiceImpl3.*(..))" id="pc1"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pc1"/>
</aop:config>
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
方式三:基于AspectJ的注解方式事务管理
<!-- 开启注解方式 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
@Transactional(propagation=Propagation.REQUIRED)
/*<!--
propagation:事物的传播行为
isolation:事物的隔离级别
read-only:只读
rollback-for:发生哪些异常回滚
no-rollback-for:发生那些异常不回滚
timeout : 超时期限
-->*/