@Transactional注解分析

2024-09-05 11:18
文章标签 分析 注解 transactional

本文主要是介绍@Transactional注解分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

事务具备ACID特性,即原子性、一致性、隔离性和持久性。

@Transactional注解是用来指定接口、类或方法必须拥有事务语义的元数据。
@Transactional注解就代表支持事务管理,如果这个注解在类上,那么表示该注解对于所有该类中的public方法都生效;如果注解出现在方法上,则代表该注解仅对该方法有效,会覆盖先前从类层次继承下来的注解。
一般情况下不要将这个注解加到接口和抽象类上,因为注解是不能被继承的。

@Transactional注解如果被你在protected、private、或者package-visible的方法上使用
@Transactional注解,它不会报错,但是这个被注解的方法将不会展示已配置的事务设置。
@Transactional注解不足以开启事务行为,它仅仅是一种元数据,能够被可以识别@Transactional注解
和配置适当的具有事务行为的beans所使用。
当在接口上使用@Transactional注解时,只有当你设置了基于接口的代理才能生效。因为
注解不能继承,意思就是如果你正在使用基于类的代理时,事务的设置将不能被基于类的代理所识别,
而且对象也将不会被事务代理所包装。因此Spring团队也建议并且在具体的类上用@Transactional注解。


1. propagation参数,Propagation类型(枚举),默认值为Propogation.REQUIRED,支持的值有REQUIRED、MANDATORY、NESTED、NEVER、NOT_SUPPORTED、REQUIRE_NEW、SUPPORTS。关于这个问题的详细说明将在以后的文章中展开。
2. isolation参数,Isolation类型(枚举),默认值为Isolation.DEFAULT,支持的值有DEFAULT、READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ、SERIALIZABLE。关于这个问题的详细说明将在以后的文章中展开。
3. timeout参数,int类型,事务的超时时间,默认值为-1,即不会超时。
4. readOnly参数,boolean类型,true表示事务为只读,默认值为false。
5. rollbackFor参数,Class<? extends Throwable>[]类型,默认为空数组。
6. rollbackForClassName参数,String[]类型,默认为空数组。
7. noRollbackFor参数,Class<? extends Throwable>[]类型,默认为空数组。
8. noRollbackForClassName参数,String[]类型,默认为空数组。


5、6、7、8与回滚有关,
一般不推荐使用rollbackForClassName和noRollbackForClassName两个参数,
因为使用字符串的缺点有:如果不是用类的完整路径,就可能导致回滚设置对位于不同包中的同名类都生效;且如果类名写错,也无法得到IDE的动态提示。

如果不配置任何与回滚有关的参数,不代表事务不会进行回滚,如果没有配置这四个选项,那么DefaultTransactionAttribute配置将会生效,具体的行为是,抛掷任何unchecked Exception都会触发回滚,当然包括所有的RuntimeException。

 属性 类型描述
传播性 枚举型:Propagation可选的传播性设置
 隔离性枚举型:Isolation可选的隔离性级别(默认值:ISOLATION_DEFAULT)
只读性布尔型读写型事务vs.只读型事务
超时int型(以秒为单位)事务超时
回滚异常类(rollbackFor)

一组Class类的实例,必须

是Throwable的子类

一组异常类,遇到时必须进行回滚。默认情况下checked exceptions不进行回滚,仅unckecked exceptions(即RuntimeException的子类)才进行事务回滚。
回滚异常类名(rollbackForClassname) 一组Class类的名字,必须

是Throwable的子类

一组异常类名,遇到时必须进行回滚
不回滚异常来(noRollbackFor) 一组Class类的实例,必须

是Throwable的子类

一组异常类,遇到时必须不回滚
不会滚异常类名(noRollbackForClassname)一组Class类的实例,必须

是Throwable的子类

一组异常类,遇到时必须不回滚


默认遇到throw new RuntimeException("...");会回滚
需要捕获的throw new Exception("...");不会回滚

RuntimeException运行期例外,默认回滚
Exception 非运行期例外,不回滚

例如:
// 指定回滚
@Transactional(rollbackFor=Exception.class)
    public void methodName() {
       throw new Exception("...");// 不会回滚
    }
//指定不回滚
@Transactional(noRollbackFor=Exception.class)
    public ItimDaoImpl getItemDaoImpl() {
        throw new RuntimeException("注释");// 会回滚
    }

 

 

// 如果有事务,那么加入事务,没有的话新建一个(不写的情况下)
@Transactional(propagation=Propagation.REQUIRED)
// 容器不为这个方法开启事务
@Transactional(propagation=Propagation.NOT_SUPPORTED)
// 不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.REQUIRES_NEW)
// 必须在一个已有的事务中执行,否则抛出异常,不能自动创建。
@Transactional(propagation=Propagation.MANDATORY)
// 必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.NEVER)
// 如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
@Transactional(propagation=Propagation.SUPPORTS)

 


// readOnly=true只读,不能更新,删除
@Transactional (propagation = Propagation.REQUIRED,readOnly=true)
// 设置超时时间
@Transactional (propagation = Propagation.REQUIRED,timeout=30)
// 设置数据库隔离级别
@Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT




这篇关于@Transactional注解分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138806

相关文章

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串