Spring3事务管理——使用@Transactional 注解

Spring3事务管理——使用@Transactional 注解

操作方法

  • 01

    先让我们看代码吧!以下代码为在“Spring3事务管理——基于tx/aop命名空间的配置”基础上修改。首先修改applicationContext.xml如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 … <!-- 定义一个数据源 --> <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/spring_test" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean> <!-- 定义JdbcTemplate的Bean --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" p:dataSource-ref="dataSource"> </bean> <!-- 配置事务管理器 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource"> </bean> <!-- enables scanning for @Transactional annotations --> <tx:annotation-driven transaction-manager="txManager" /> <!-- 在该Bean的代码中标注@Transactional可以被事务管理器注入 --> <bean id="userScore" class="net.hingyi.springDemo.transaction.service.UserScoreServiceImpl" p:userScoreRepository-ref="userScoreRepository_jdbc" /> <bean id="userScoreRepository_jdbc" class="net.hingyi.springDemo.transaction.repository.UserScoreRepositoryImpl" p:jdbcTemplate-ref="jdbcTemplate" /> …

  • 02

    实现类代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 @Transactional public class UserScoreRepositoryImpl implements UserScoreRepository { private JdbcTemplate jdbcTemplate; @Override public UserScore getUserSocore(String userNo) { final UserScore us = new UserScore(); ... return us; } ... } OK了!以上就实现了简单的事务管理了。现在再稍微了解下@Transactional。在配置文件中,默认情况下,<tx:annotation-driven>会自动使用名称为transactionManager的事务管理器。所以,如果定义的事务管理器名称为transactionManager,那么就可以直接使用<tx:annotation-driven/>。如下: ? 1 2 3 4 5 6 7 8 <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource"> </bean> <!-- enables scanning for @Transactional annotations --> <tx:annotation-driven/>

  • 03

    <tx:annotation-driven>一共有四个属性如下, mode:指定Spring事务管理框架创建通知bean的方式。可用的值有proxy和aspectj。前者是默认值,表示通知对象是个JDK代理;后者表示Spring AOP会使用AspectJ创建代理 proxy-target-class:如果为true,Spring将创建子类来代理业务类;如果为false,则使用基于接口的代理。(如果使用子类代理,需要在类路径中添加CGLib.jar类库) order:如果业务类除事务切面外,还需要织入其他的切面,通过该属性可以控制事务切面在目标连接点的织入顺序。 transaction-manager:指定到现有的PlatformTransaction Manager bean的引用,通知会使用该引用 @Transactional的属性 属性名 类型 说明 isolation 枚举org.springframework.transaction.annotation.Isolation的值 事务隔离级别 noRollbackFor Class<? extends Throwable>[] 一组异常类,遇到时不回滚。默认为{} noRollbackForClassName Stirng[] 一组异常类名,遇到时不回滚,默认为{} propagation 枚举org.springframework.transaction.annotation.Propagation的值 事务传播行为 readOnly boolean 事务读写性 rollbackFor Class<? extends Throwable>[] 一组异常类,遇到时回滚 rollbackForClassName Stirng[] 一组异常类名,遇到时回滚 timeout int 超时时间,以秒为单位 value String 可选的限定描述符,指定使用的事务管理器 @Transactional标注的位置@Transactional注解可以标注在类和方法上,也可以标注在定义的接口和接口方法上。如果我们在接口上标注@Transactional注解,会留下这样的隐患:因为注解不能被继承,所以业务接口中标注的@Transactional注解不会被业务实现类继承。所以可能会出现不启动事务的情况。所以,Spring建议我们将@Transaction注解在实现类上。在方法上的@Transactional注解会覆盖掉类上的@Transactional。 使用不同的事务管理器如果我们要程序中使用多个事务管理器(主要是针对多数据源的情况),可以通过以下的方式实现:Service代码: ? 1 2 3 4 5 6 7 8 9 10 11 public class MultiTxService { @Transactional("tran_1") public void addTest(int id){ } @Transactional("tran_2") public void deleteTest(int id){ } } applicationContext.xml配置如下: ? 1 2 3 4 5 6 7 8 9 10 <bean id="tran_1" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource"> <qualifier value="tran_1"/> </bean> <bean id="tran_2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource"> <qualifier value="tran_2"/> </bean> 经过以上的代码,每个事务都会绑定各自的独立的数据源,进行各自的事务管理。我们可以优化下以上代码,可以自定义一个绑定到特定事务管理器的注解,然后直接使用这个自定义的注解进行标识: ? 1 2 3 4 5 6 @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Transactional("tran_1") public @interface CustomerTransactional { } 在Service代码中使用: ? 1 2 3 4 5 6 7 ... //使用名为tran_1的事务管理器 @CustomerTransactional public void addTest(String str){ } …

(0)

相关推荐

  • MS DTC 事务管理器无法启动的解决方案

    无法启动 MS DTC 事务管理器--解决方案 事件类型:错误 事件来源:MSDTC 事件类别:SVC 事件ID:4112 事件描述:无法启动 MS DTC 事务管理器。 -------------- ...

  • 人生日历便捷事务管理,新增记事搜索

    繁忙的日常事务常常让人难以理清头绪,你是否也身陷其中倍感头疼?让人生日历来帮你,新增记事搜索功能,帮你更便捷的理清繁琐事务! 在人生日历上记录的事务繁多,如何快捷的锁定急需处理的事务?来随小编体验体验 ...

  • 寺庙管理系统软件慈善众筹和养老管理

    寺院管理要保证基础建设与宣传两不误,亦要保证经济来源支持建设与弘法. 在高速发展的信息时代,保持传统的管理方法可能不适于与信众的沟通同时无利于佛法弘扬.结合科学方法的才是现代管理的关键之所在. 操作方 ...

  • spring与mybatis三种整合方法详细教程

    spring与mybatis三种整合方法详细教程

  • Spring + Spring MVC + Mybatis 高性能web构建实例教程详解

    用最合适的技术去实现,并不断追求最佳实践.这就是架构之道. 希望这篇文章能给你们带来一些帮助,同时希望你们可以为这个项目贡献你的想法. 源码地址:https://github.com/Eliteams ...

  • 使用netbeans搭建jsf+spring框架的方法

    使用netbeans 搭建 JSF+SPRING 框架 spring版本使用4,jsf版本2.2 jsf的配置文件faces-config.xml 复制代码 代码如下: <?xml versio ...

  • 工作站是什么意思 工作站的详细介绍

    由计算机和相应的外部设备以及成套的应用软件包所组成的信息处理系统。它能够完成用户交给的特定任务,是推动计算机普及应用的有效方式。工作站应具备强大的数据处理能力,有直观的便于人机交换信息的用户接口,可以 ...

  • 笔记本内存升级必读(

    随着人们对更高工作效率的不断追求,笔记本电脑逐渐走入了人们的生活,成为现代移动办公最有效的工具之一,越来越多的人依靠它方便地进 行事务管理、资料查询。 此外,许多人也用笔记本电脑替代台式机,以满足移动 ...

  • Windows Server 2008之数据安全保护

    数据安全是任何数据服务解决方案中的一个关键要求,而Windows Server 2008和SQL Server 2008结合起来,通过一个基于加密技术的强大集合提供了一个端对端数据保护。 Window ...