@Transactional 用法和原理

简介: @Transactional 用法和原理

@Transactional 是 Spring 框架中的一个注解,它用于声明一个方法或类需要进行事务管理。当你在方法或类上使用此注解时,Spring 会确保该方法或类中的所有数据库操作都在一个事务中执行。如果事务中的某个操作失败,则整个事务将被回滚,以确保数据的一致性。

用法
在方法上使用:

@Service
public class MyService {

@Transactional
public void someTransactionalMethod() {
    // ... 数据库操作 ...
}

}
在类上使用:当在类上使用 @Transactional 注解时,该类中的所有公共方法都将运行在事务中。

@Service
@Transactional
public class MyService {

public void method1() {
    // ... 数据库操作 ...
}

public void method2() {
    // ... 数据库操作 ...
}

}
指定传播行为、隔离级别等:你可以通过注解的参数来指定事务的传播行为、隔离级别、只读属性等。

@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE, readOnly = false)
public void someSpecialMethod() {
// ...
}
原理
AOP(面向切面编程):Spring 通过 AOP 代理来管理事务。当你对一个类或方法添加 @Transactional 注解时,Spring 会为该类或方法创建一个代理。这个代理会在方法调用前后添加额外的逻辑来管理事务。
事务管理器:Spring 使用 PlatformTransactionManager 接口的实现类(如 DataSourceTransactionManager、JpaTransactionManager 等)来管理事务。这些管理器负责与底层数据库进行交互,以确保事务的正确开始、提交或回滚。
事务属性:通过 @Transactional 注解,你可以指定多种事务属性,如传播行为(Propagation)、隔离级别(Isolation)、只读(ReadOnly)和回滚规则(rollbackFor、noRollbackFor)等。这些属性决定了事务如何与现有的事务进行交互、事务的可见性以及其他事务特性。
事务传播行为:Spring 支持七种不同的事务传播行为,例如 REQUIRED、REQUIRES_NEW、NESTED 等。这些传播行为决定了当一个事务方法被另一个事务方法调用时应该如何处理事务。
事务隔离级别:为了防止多个事务并发执行时产生的问题(如脏读、不可重复读、幻读等),数据库提供了隔离级别来控制事务之间的可见性。Spring 支持所有的 SQL 标准隔离级别,如 READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ 和 SERIALIZABLE。
自动提交与回滚:如果事务方法成功完成,则事务会自动提交。如果在事务方法中抛出了未检查的异常(即运行时异常),则事务会自动回滚。你也可以通过 @Transactional 注解的 rollbackFor 和 noRollbackFor 属性来自定义回滚规则。
总之,@Transactional 注解是 Spring 框架中用于声明式事务管理的强大工具,它简化了事务管理的复杂性,并允许开发者通过简单的注解来控制事务行为。

相关文章
|
存储 SQL 分布式计算
Flink - 读取 Parquet 文件 By Scala / Java
parquet 文件常见与 Flink、Spark、Hive、Streamin、MapReduce 等大数据场景,通过列式存储和元数据存储的方式实现了高效的数据存储与检索,下面介绍 Flink 场景下如何读取 Parquet。
1927 0
Flink - 读取 Parquet 文件 By Scala / Java
|
消息中间件 存储 安全
【深入浅出RocketMQ原理及实战】「底层原理挖掘系列」透彻剖析贯穿RocketMQ的消息顺序消费和并发消费机制体系的原理分析
【深入浅出RocketMQ原理及实战】「底层原理挖掘系列」透彻剖析贯穿RocketMQ的消息顺序消费和并发消费机制体系的原理分析
471 0
|
10月前
|
SpringCloudAlibaba JavaScript Dubbo
【SpringCloud Alibaba系列】Dubbo dubbo-admin安装教程篇
本文介绍了 Dubbo-Admin 的安装和使用步骤。Dubbo-Admin 是一个前后端分离的项目,前端基于 Vue,后端基于 Spring Boot。安装前需确保开发环境(Windows 10)已安装 JDK、Maven 和 Node.js,并在 Linux CentOS 7 上部署 Zookeeper 作为注册中心。
2955 1
【SpringCloud Alibaba系列】Dubbo dubbo-admin安装教程篇
|
存储 Java 测试技术
阿里巴巴java开发手册
这篇文章是关于阿里巴巴Java开发手册的整理,内容包括编程规约、异常日志、单元测试、安全规约、MySQL数据库使用以及工程结构等方面的详细规范和建议,旨在帮助开发者编写更加规范、高效和安全的代码。
|
存储 Prometheus 运维
All in One:Prometheus 多实例数据统一管理最佳实践
当管理多个Prometheus实例时,阿里云Prometheus托管版相比社区版提供了更可靠的数据采集和便捷的管理。本文比较了全局聚合实例与数据投递方案,两者在不同场景下各有优劣。
63338 122
|
Oracle 关系型数据库
oracle的start with connect by prior如何使用 整理
oracle的start with connect by prior如何使用 整理
806 4
|
供应链 监控 算法
ERP系统中的库存优化与库存周转率分析解析
【7月更文挑战第25天】 ERP系统中的库存优化与库存周转率分析解析
1163 1
|
机器学习/深度学习 自然语言处理 算法
必知的技术知识:IK分词器实现原理剖析——一个小问题引发的思考
必知的技术知识:IK分词器实现原理剖析——一个小问题引发的思考
430 0
|
消息中间件 分布式计算 前端开发
盘点 35 个 Apache 顶级项目,我拜服了…
盘点 35 个 Apache 顶级项目,我拜服了…
4328 1
盘点 35 个 Apache 顶级项目,我拜服了…
|
域名解析 负载均衡 网络协议
【域名解析 DNS 专栏】如何利用 DNS 实现地理位置路由
【5月更文挑战第25天】利用DNS进行地理位置路由,能根据用户位置导向最近服务器,提升网络效率和用户体验。通过判断请求IP地址归属地,DNS返回相应区域的服务器IP。简单示例代码展示了如何实现此功能,但实际应用需借助专业数据库和处理网络复杂性的工具。尽管面临挑战,如代理服务器和网络环境影响,但DNS地理位置路由仍是优化网络性能的关键技术,对于内容分发和负载均衡具有重要意义。随着技术进步,这一领域的潜力将持续挖掘。
408 0