Spring Boot 声明式事务

server/2024/12/20 7:20:13/

Spring Boot中的声明式事务管理主要通过@Transactional注解来实现。以下是@Transactional注解的一些关键用法和特性:
1. 启用事务管理
在Spring Boot应用中使用@Transactional注解之前,需要在启动类或者配置类上添加@EnableTransactionManagement注解来启用事务管理支持。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@SpringBootApplication
@EnableTransactionManagement
public class TransactionManagementApplication {
    public static void main(String[] args) {
        SpringApplication.run(TransactionManagementApplication.class, args);
    }
}

2. 使用@Transactional注解
@Transactional注解可以应用于类或者方法上。如果应用于类上,则该类中的所有方法都会默认拥有声明的事务属性。
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class EmployeeService {
    @Transactional
    public Employee addEmployee(Employee employee) {
        // 数据库操作
        return employee;
    }
}

3. 事务属性
@Transactional注解有多个属性来定制事务行为,包括:
•  propagation:事务的传播行为,默认值为Propagation.REQUIRED,表示如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
•  isolation:事务的隔离级别,默认值为Isolation.DEFAULT,表示使用底层数据库的默认隔离级别。
•  timeout:事务的超时时间,默认值为-1,表示不超时。
•  readOnly:指定事务是否为只读事务,默认值为false。
•  rollbackFor:指定哪些异常会导致事务回滚。
•  noRollbackFor:指定哪些异常不会导致事务回滚。
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, timeout = 30)
public void createEntity(MyEntity myEntity) {
    myRepository.save(myEntity);
}

4. 事务管理器
Spring Boot会根据添加的依赖自动配置相应的事务管理器。如果添加的是spring-boot-starter-jdbc依赖,框架会默认注入DataSourceTransactionManager实例。如果添加的是spring-boot-starter-data-jpa依赖,框架会默认注入JpaTransactionManager实例。
5. 事务的工作原理
Spring的声明式事务管理是通过Spring AOP实现的,它允许你在配置中声明事务边界,而不是在代码中。这种方式减少了样板代码的数量,让业务逻辑更加清晰,并且在大多数情况下,是更推荐使用的事务管理策略。
6. 事务事件
从Spring 4.2开始,事件的监听器可以绑定到事务的某个阶段。例如,可以在事务成功提交后处理事件。
通过使用@Transactional注解,Spring Boot提供了一种简单而强大的声明式事务管理机制,使得事务管理与业务逻辑解耦,提高了代码的可维护性和可读性。


http://www.ppmy.cn/server/151645.html

相关文章

SQL或ORM获取随机一行数据

MySQL 使用ORDER BY RAND()结合LIMIT来实现。例如,有一个名为employees的表,要从中随机获取一行数据,可以使用以下语句: SELECT * FROM employees ORDER BY RAND() LIMIT 1; 使用order_by(?) 在 Django 中,可以使用order_by(?)来对查询集进行随机排序,然后取第一条数…

Python构造方法:对象的“开机启动程序”

在Python中,构造方法(__init__)是一个类的“生命之初”,定义了每个对象从“出生”到“投入使用”的整个初始化过程。那既然类里可以直接写属性,为什么还需要构造方法呢? 构造方法的核心作用:创…

搭建MongoDB

title: 搭建MongoDB date: 2024-11-30 23:30:00 categories: - 服务器 tags: - MongoDB - 大数据搭建MongoDB 环境&#xff1a;Centos 7-2009 1. 创建MongoDB的国内yum源 # 下载Centos7对应最新版7.0.15的安装包 cat >> /etc/yum.repos.d/mongodb.repo << &quo…

生态学研究中,森林生态系统的结构、功能与稳定性是核心研究

在生态学研究中&#xff0c;森林生态系统的结构、功能与稳定性是核心研究内容之一。这些方面不仅关系到森林动态变化和物种多样性&#xff0c;还直接影响森林提供的生态服务功能及其应对环境变化的能力。森林生态系统的结构主要包括物种组成、树种多样性、树木的空间分布与密度…

Docker 部署 新版 Nacos、Seata

Docker 部署 新版 Nacos、Seata 版本说明 名称版本号Nacos2.4.3Seata2.0.0 Nacos 启动容器 # MODEstandalone 系统启动方式: 单机 # NWEzYzdkNmMtZjQ5Ny00ZDY4LWE3MWEtMmU1ZTMzNDBiM2Nh 为 5a3c7d6c-f497-4d68-a71a-2e5e3340b3ca 的Base64 编码表示,可以修改&#xff0c;…

Linux -- 线程控制相关的函数

目录 pthread_create -- 创建线程 参数 返回值 代码 -- 不传 args&#xff1a; 编译时带 -lpthread 运行结果 为什么输出混杂&#xff1f; 如何证明两个线程属于同一个进程&#xff1f; 如何证明是两个执行流&#xff1f; 什么是LWP&#xff1f; 代码 -- 传 args&a…

监听ECharts图表dataZoom动态显示图表内容

需求 从接口获取到84条数据&#xff0c;要求一开始全显示的时候不显示inside的label&#xff0c;不管怎么滑动dataZoom的x轴&#xff0c;只要图表上的数据小于20条&#xff0c;就需要显示inside的label&#xff0c;否则不显示 1、第一时间肯定要监听dataZoom的事件&#xff0c;…

TCP常见问题

文章目录 一、两种状态图二、常见问题1、MSL是什么 3、为何等待2MSL3、为何三次握手&#xff0c;不握手、握手一次、两次行吗4、为何四次挥手&#xff0c;三次行吗&#xff0c;两次行吗 一、两种状态图 四次挥手 二、常见问题 1、MSL是什么 MSL是Maximum Segment Lifetime的英…