什么是事物?
事物是指逻辑上的一组操作,这组操作要么全部成功,要么全部失败。
事物的特性:
原子性、一致性、隔离性、持久性
Spring事务管理的高级接口:
PlatformTransactionManage:(根基不同的持久层框架使用不同的具体实现)
TransactionDefinition:(隔离级别(ISOLATION)、传播行为(PROPAGATION)、超时时间(TIMEOUT)、只读)
TransactionStatus: (记录事物的状态)
Sring实现事务管理的方式:
编程式事务管理:实际应用中很少使用,通过TransactionTemplate手动实现
1.<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
</bean>
2.<!-- 编程式事务管理 -->
<!-- 配置事物管理的模板:spring为简化事物管理的代码而提供的类 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
</bean>
3.//在需要事物管理的类中调用transactionTemplate.execute方法
public void transferByTransactionTemplate(String out, String in, Double money) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
accountDao.inMoney(in, money);
accountDao.outMoney(out, money);
}
});
}
使用XML声明式事务管理:开发中推荐使用(代码侵入性小),通过Spring的AOP实现
a.ProxyFactoryBean + XML :早期spring2.0的方式
<!-- 通过ProxyFactoryBean + XML方式实现事物管理 -->
<!-- 配置业务层的代理 -->
<bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 配置目标对象 -->
<property name="target" ref="accountService" />
<!-- 注入事物管理类 -->
<property name="transactionManager" ref="transactionManager" />
<!-- 注入事物的相关属性 -->
<property name="transactionAttributes">
<props>
<!--
prop的格式:
*PROPAGATION :事物的传播行为
*ISOLATION :事物的隔离级别
*readOnly :只读
*-Exception :需要回滚的异常
*+Exception :不需回滚的异常
-->
<prop key="transferByAOP">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
b.tx:advice + aop方式: 一次配置永久生效
<!-- 通过AOP方式实现声明式事务管理 -->
<!-- 配置事物的通知:(事物增强) -->
<tx:advice id="txAdcive" transaction-manager="transactionManager">
<tx:attributes>
<!--
<tx:method 相关属性
*propagation :事物传播行为
*isolation :事务隔离级别
*read-only :只读
*rollback-for :需要回滚的异常
*no-rollback-for :不需回滚的异常
*timeout :超时时间
-->
<tx:method name="transferByAOP" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 配置切面 -->
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut id="pointcut" expression="execution(* com.cgj.spring.transaction.service.impl.AccountServiceImpl.transferByAOP(..))"/>
<!-- 配置切面 -->
<aop:advisor advice-ref="txAdcive" pointcut-ref="pointcut"/>
</aop:config>
c.@Transactional注解的方式:(推荐)注解控制
a.<!-- 配置基于注解的声明式事物 -->
<!-- 默认使用注解来管理事物行为 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
b.在需要事物管理的类或者方法上加(相关属性在注解的属性中配置,不配置使用默认值) @Transactional
声明式事务管理 事物的传播行为:
未完待续