zoukankan      html  css  js  c++  java
  • Spring 声明式事务管理

    在 Spring 中提供了两种事务管理的方式,分别是编程式事务管理声明式事务管理

    在实际应用中,目前很少需要用到编程式事务管理,尽管它比较灵活,但写编程的过程会很繁琐。

    Spring 的声明式事务是通过 Spring AOP 实现的,通过事务的声明性信息,Spring 负责将事务管理增加逻辑动态织入业务方法的相应连接点中。

    这些逻辑包括获取线程绑定资源、开始事务、提交/回滚事务、进行异常转换和处理等工作。

    使用声明式事务有两种配置方式:XML 配置注解配置

    在实际项目中一般采用的是注解配置方式,所以这里只介绍注解配置声明式事务

    使用 @Transactional 注解

    @Service
    @Transactional	//对业务类使用事务增强的标注
    public class BbtFormImpl implements IBbtForm {
        public Forum getForum(int foeumId) {
            return forumDao.getForum(forumId)
        }
        ...
    }
    

    因为注解本身具有一组普适性的默认事务属性,所以一般只要在业务类中添加一个 @Transactional 注解,就能完成业务类事务属性的配置。

    当然,注解只提供元数据,本身并不能完成事务切面织入的功能。因此还需要在 Spring 配置中一行注解扫描驱动的配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context.xsd
                http://www.springframework.org/schema/tx
                http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
                http://www.springframework.org/schema/aop
                http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
       	...
        
        <!-- 注册事务管理注解扫描驱动 -->
        <tx:annotation-driven transaction-manager="txManager"/>
        
        ...
    </beans>
    

    @Transactional 的属性

    注解本身具有一组普适性的默认属性,所以一般不需要手动设置事务注解的属性。当然也有一些特殊情况需要通过手工设置属性值去覆盖默认值。

    在何处标注 @Transactional 注解

    @Transactional 注解可以被应用在接口、接口方法、类、类的 public 方法上。

    Spring 建议在业务实现类上使用 @Transactional 注解。因为这个注解设定为不能被继承,如果在业务接口上标注 @Transactional ,则不会被业务实现类继承,业务类就不会启动事务机制。

    方法处的注解会覆盖类定义处的注解。

    如果有些方法需要使用特殊的事务属性,则可以在类注解的基础上提供方法注解:

    //1.类级注解,适用于类中所有public方法
    @Transactional
    public class BbtForum {
        
        //2.采用额外的注解配置,它将覆盖类级注解
        @Transactional(readOnly=true)
        public Forum getForum(int foeumId) {
            return forumDao.getForum(forumId)
        }
        ...
    }
    

    @Transactional 注解失效

    注意!! @Transaction 不起作用的地方:

    1. 静态(static )方法,
    2. (private)私有化方法,
    3. 自调用方法(因为事务是依赖aop的,而aop是通过动态代理实现的)

    小结

    Spring 声明式事务是 Spring 中的亮点,也是被使用最多的功能之一。

    Spring 事务管理是 Spring AOP 技术的精彩应用的案例。事务管理作为一个切面织入目标业务方法的周围,业务方法完全从事务代码中解脱出来,代码复杂度大大降低。

    而 Spring 事务管理作为Spring 中的亮点,它也是难点之一。这里只是简单介绍了声明式事务的使用,而想要彻底掌握,还需要去了解他们内部的机制。

  • 相关阅读:
    Window7下安装openssl完整版(亲测实现)
    Android 使用OkHttp
    Android应用中使用AsyncHttpClient来异步网络数据
    Android开发okhttp,retrofit,android-async-http,volley?
    Android开源框架AsyncHttpClient (android-async-http)使用
    15 个最好的 Bootstrap 设计工具推荐
    Bootstrap+angularjs+MVC3+分页技术+角色权限验证系统
    PKU 1509 Glass Beads (最小表示法)
    SQL Server 数据库没有有效全部者的三种解决的方法
    javascript小白学习指南0---1
  • 原文地址:https://www.cnblogs.com/luler/p/14980314.html
Copyright © 2011-2022 走看看