spring的事务管理

来源:互联网 发布:肖像权网络侵权管辖 编辑:程序博客网 时间:2024/05/29 17:36

参考博客:Spring3核心技术之事务管理机制
Spring对事务管理的支持的发展历程(基础篇)
全局事务与本地事务的区别应用

Spring对事务管理的支持

spring事务管理抽象主要包含3个接口

  • PlatformTransactionManager
    平台事务管理器
  • TransactionDefinition
    事务定义信息(隔离、传播、超时、只读)
  • TransactionStatus
    事务具体运行状态
Spring为不同的持久化框架提供了不同的PlatformTransactionManager接口实现。

spring提供的平台事务管理器实现
1)DataSourceTransactionManager  ---针对jdbc和mybatis实现
2)HibernateTransationManager-------针对hibernate实现


Spring 支持两种方式事务管理

1.编程式的事务管理(实际应用很少使用)

实际应用中,很少需要使用编程来进行事务管理。但Spring还是为编程式事务管理提供了模板类org.springframework.transaction.support.TransactionTemplate以满足一些特殊场合的需要。
编程式事务主要是通过TransactionTemplate手动管理事务。省略了部分的提交、回滚和一系列的事务对象定义
需注入事务管理对象.



<!-- 配置事务管理器 --><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!-- 事务模板 --><bean id="txTemplate" class="org.springframework.transaction.support.TransactionTemplate"><property name="transactionManager" ref="txManager"/></bean>


DEMO

<!-- jdbc.properties配置文件 --><context:property-placeholder location="classpath:jdbc.properties"/><!-- 数据源 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${driverClass}"/><property name="jdbcUrl" value="${jdbcUrl}"/><property name="user" value="${user}"/><property name="password" value="${password}"/><property name="initialPoolSize" value="${initialPoolSize}"/><property name="maxPoolSize" value="${maxPoolSize}"/><property name="minPoolSize" value="${minPoolSize}"/></bean><!-- jdbc模板:简化获取连接、关闭连接、回滚等操作 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" <!-- 事务管理器:jdbc事务管理器 --><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!-- 事务模板 --><bean id="txTemplate" class="org.springframework.transaction.support.TransactionTemplate"><property name="transactionManager" ref="txManager"></property></bean><!-- accountDao --><bean id="accountDao" class="cn.it.manualTransaction.dao.AccountDao"><property name="jdbcTemplate" ref="jdbcTemplate"></property></bean><!-- accountService --><bean id="accountService" class="cn.it.manualTransaction.service.AccountService"><property name="accountDao" ref="accountDao"></property><property name="txTemplate" ref="txTemplate"></property></bean>
AccountService.java
public class AccountService {private AccountDao accountDao;private TransactionTemplate txTemplate;/** * 转账 * @param outName * @param inName * @param money */public void transfer(final String outName,final String inName,final Double money){txTemplate.execute(new TransactionCallbackWithoutResult() {@Overrideprotected void doInTransactionWithoutResult(TransactionStatus arg0) {//转账事务accountDao.out(outName, money);//转出int i=1/0;accountDao.in(inName, money);//转入}});}public AccountDao getAccountDao() {return accountDao;}public void setAccountDao(AccountDao accountDao) {this.accountDao = accountDao;}    public void setTxTemplate(TransactionTemplate txTemplate) {this.txTemplate = txTemplate;}}

2.声明式事务管理(代码侵入性最小,推荐使用)

大多数的用户选择声明式事务管理的功能,这种方式对代码侵入性最小,可以让事务管理代码完全从业务中移除,非常符合非侵入式轻量级容器的理念。
Spring的声明式事务是通过AOP实现的。通过事务的声明性信息,Spring负责将事务管理增强逻辑动态织入到业务方法相应的连接点中。这些事务管理增强逻辑包括获取线程绑定资源,开始事务,提交/回滚事务,进行异常转换和处理等工作。

1>XML配置方式


1.原始方式------TransactionProxyFactoryBean方式(不再被推荐)
在Spring早期版本中,用户必须通过TransactionProxyFactoryBean代理类对需要事务管理的业务进行代理,以便实施事务功能的增强。在Spring3.x中,该方式已经不被推荐,但它依然是可用的。
2.推荐方式------基于tx/aop命名空间的配置(推荐----spring3.x方式)
Spring在基于Schema的配置中,添加了一个tx命名空间,在配置文件中以明确结构化的方式定义事务属性,大大提高了配置事务属性的便利性。配合aop命名空间所提供切面定义,业务类方法事务配置得到了大大的简化,描述能力上得到了很大的提升。

1.首先要引入tx和aop命名空间的声明。

2.配置切面(切点+增强/通知)
<!-- 事务管理器:jdbc事务管理器 --><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!-- 配置切点切面 --><aop:config><!-- 切点 --><aop:pointcut id="myPointcut" expression="execution(* cn.it.declarativeTransaction.aspectj.xml.service.*.*(..))"/><!-- 切面 --><aop:advisor pointcut-ref="myPointcut" advice-ref="myAdvice"/></aop:config>
3.声明事务增强/通知
<!-- 事务通知 --><tx:advice id="myAdvice" transaction-manager="txManager"><tx:attributes><!-- transfer():转账方法进行事务控制 --><tx:method name="transfer*" propagation="REQUIRED"/></tx:attributes></tx:advice>

2>注解方式

Spring还提供了基于注解的事物配置,即通过@Transactional对需要事务增强的Bean接口,实现类或者方法进行标注,在容器中配置基于注解的事务增强驱动,即可启用基于注解的声明式事务。这种方式配置就更加简单了。
1.开启注解驱动
<!-- 开启事务注解驱动 --><tx:annotation-driven transaction-manager="txManager"/>
2.在服务类上添加@Transactional注解
@Transactionalpublic class AccountService {}


0 0