深入理解@Transactional注解

在Spring框架中,@Transactional注解是用来管理事务的关键注解之一。本文将详细解释@Transactional注解的作用、属性和使用方法,并提供代码实例来演示其在实际项目中的应用。

1、@Transactional注解的作用

@Transactional注解用于声明一个方法需要在一个事务中执行,当方法被调用时,Spring会自动创建一个事务并在方法执行完毕后根据方法的执行结果来提交或回滚事务。

2、 @Transactional注解的属性

@Transactional注解有许多属性可以用来定制事务的行为,其中一些常用属性包括:

propagation:事务的传播行为
isolation:事务的隔离级别
timeout:事务超时时间
readOnly:是否为只读事务
rollbackFor:指定哪些异常触发事务回滚

1、propagation(事务的传播行为)
propagation属性用于指定事务方法的传播行为,即当一个事务方法被另一个事务方法调用时,应该如何处理事务。以下是propagation属性的可选值及其含义:

  • Propagation.REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。

  • Propagation.SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。

  • Propagation.MANDATORY:强制要求当前存在事务,如果没有事务则抛出异常。

  • Propagation.REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则挂起当前事务。

  • Propagation.NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则挂起当前事务。

  • Propagation.NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。

  • Propagation.NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则创建一个新事务。
    2、isolation(事务的隔离级别)
    isolation属性用于指定事务的隔离级别,即多个事务同时操作数据库时,事务之间的隔禜程度。以下是isolation属性的可选值及其含义:

  • Isolation.DEFAULT:使用数据库默认的隔离级别。

  • Isolation.READ_UNCOMMITTED:允许事务读取未提交的数据更改。

  • Isolation.READ_COMMITTED:只允许事务读取已提交的数据。

  • Isolation.REPEATABLE_READ:确保事务可以多次读取相同的数据,并且在事务期间数据不会被其他事务修改。

  • Isolation.SERIALIZABLE:确保事务可以多次读取相同的数据,并且在事务期间数据不会被其他事务修改,达到最高的隔离级别。
    3、timeout(事务超时时间)
    timeout属性用于指定事务的超时时间,即事务执行的最长时间。如果事务执行时间超过指定的超时时间,事务将自动回滚。timeout属性的值为秒数,默认为-1,表示没有超时限制。

4、 readOnly(是否为只读事务)
readOnly属性用于指定事务是否为只读事务,即只读取数据而不修改数据。如果将readOnly属性设置为true,则表示事务只读取数据,不会对数据进行修改;如果设置为false,则表示事务可以读取和修改数据。

5、rollbackFor(指定哪些异常触发事务回滚)
rollbackFor属性用于指定哪些异常会触发事务回滚。可以指定一个或多个异常类,当事务方法中抛出指定的异常时,事务将回滚。如果不指定任何异常类,默认只有RuntimeException及其子类会触发事务回滚。

以上是对propagation、isolation、timeout、readOnly和rollbackFor属性的详细解释及其可选值的含义。这些属性可以根据具体的业务需求来设置,以确保事务的正确性和一致性。

@Service
public class OrderService {

    @Autowired
    private OrderRepository orderRepository;

    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false)
    public void createOrder(Order order) {
        orderRepository.saveOrder(order);
    }

    @Transactional(rollbackFor = Exception.class)
    public void cancelOrder(Long orderId) throws Exception {
        Order order = orderRepository.findOrderById(orderId);
        
        if (order.getStatus().equals("PAID")) {
            throw new Exception("Order cannot be cancelled once paid");
        }
        
        order.setStatus("CANCELLED");
        orderRepository.updateOrder(order);
    }
}

相关推荐

  1. 深入理解@Transactional注解

    2024-03-11 17:08:04       36 阅读
  2. 深入理解 @Transactional 注解在 Spring 中的应用

    2024-03-11 17:08:04       43 阅读
  3. @Transaction注解详情解释

    2024-03-11 17:08:04       34 阅读
  4. 深入理解Spring中的@Autowired注解

    2024-03-11 17:08:04       25 阅读
  5. Spring源码注解篇三:深入理解@Component注解

    2024-03-11 17:08:04       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-11 17:08:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-11 17:08:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-11 17:08:04       82 阅读
  4. Python语言-面向对象

    2024-03-11 17:08:04       91 阅读

热门阅读

  1. 算法训练营day47,动态规划15

    2024-03-11 17:08:04       43 阅读
  2. PC端使用USB模拟的串口ttyGS0登录

    2024-03-11 17:08:04       44 阅读
  3. fastgpt本地详细部署以及配置

    2024-03-11 17:08:04       46 阅读
  4. js【详解】BOM

    2024-03-11 17:08:04       48 阅读
  5. js获取日期格式&textarea高度随内容自适应

    2024-03-11 17:08:04       39 阅读
  6. cool-admin node.js 实现分页 数据获取 直接框架

    2024-03-11 17:08:04       42 阅读
  7. 【STM32+OPENMV】矩形识别

    2024-03-11 17:08:04       44 阅读
  8. Lua调用c++函数的两种办法

    2024-03-11 17:08:04       37 阅读
  9. 2k_Day1:今天是设计模式的大白话1

    2024-03-11 17:08:04       39 阅读
  10. 突破编程_C++_设计模式(装饰器模式)

    2024-03-11 17:08:04       40 阅读
  11. Unity3D AStar地图编辑与寻路测试详解

    2024-03-11 17:08:04       50 阅读
  12. JVM双亲委派模型

    2024-03-11 17:08:04       48 阅读