zoukankan      html  css  js  c++  java
  • Spring中的@Transactional

    spring中的@Transactional基于动态代理的机制,提供了一种透明的事务管理机制,方便快捷解决在开发中碰到的问题。

    一般使用是通过如下代码对方法或接口或类注释:

    @Transactional(propagation=Propagation.NOT_SUPPORTED)
    

      

    Propagation支持7种不同的传播机制:

    REQUIRED:如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。

    SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不使用事务有少许不同。

    NOT_SUPPORTED:总是非事务地执行,并挂起任何存在的事务。

    REQUIRESNEW:总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

    MANDATORY:如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

    NEVER:总是非事务地执行,如果存在一个活动事务,则抛出异常

    NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。

    下面是一些需要注意的事项,必须必须必须要看,不然遇到各种坑别说博主没有提醒你哦:

    1. 在需要事务管理的地方加@Transactional 注解。@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上。
    2. @Transactional 注解只能应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。
    3. 注意仅仅 @Transactional 注解的出现不足于开启事务行为,它仅仅 是一种元数据。必须在配置文件中使用配置元素,才真正开启了事务行为。
    4. 通过 元素的 “proxy-target-class” 属性值来控制是基于接口的还是基于类的代理被创建。如果 “proxy-target-class” 属值被设置为 “true”,那么基于类的代理将起作用(这时需要CGLIB库cglib.jar在CLASSPATH中)。如果 “proxy-target-class” 属值被设置为 “false” 或者这个属性被省略,那么标准的JDK基于接口的代理将起作用。
    5. Spring团队建议在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。在接口上使用 @Transactional 注解,只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的,这就意味着如果正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装。
    6. @Transactional 的事务开启 ,或者是基于接口的 或者是基于类的代理被创建。所以在同一个类中一个方法调用另一个方法有事务的方法,事务是不会起作用的

    物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性。

    spring支持编程式事务管理和声明式事务管理两种方式。

            编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。

            声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。

           显然声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式。声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等。

             声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,更清爽。

  • 相关阅读:
    dotnet core gbk 编码错误解决方案
    测试工程师有福啦!一键生成api文档及测试功能
    Asp.net MVC + AngularJS 统一权限管理系统(一)
    移动开发在路上-- IOS移动开发 五 网络请求封装
    移动开发在路上-- IOS移动开发系列 网络交互四(2)
    移动开发在路上-- IOS移动开发系列 网络交互四(1)
    GZIP怎么运用在.NET MVC 简单实现
    顺时针打印矩阵
    numpy教程 pandas教程 Python数据科学计算简介(莫烦 视频链接+代码笔记)
    4. Median of Two Sorted Arrays
  • 原文地址:https://www.cnblogs.com/achengmu/p/9146563.html
Copyright © 2011-2022 走看看