如何@Transactional在 Spring Boot 中使用注解

可以使用@Transactional注释来管理 Spring Boot 中的事务。在这篇博文中,我们将探讨如何使用它@Transactional来确保数据一致性并简化 Spring Boot 应用程序中的错误处理

1.基本用法

要使用@Transactional,通常将其放在需要事务行为的服务类的方法上。

java 复制代码
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService{

    @Transactional
    public void createUser() {
        // enter your transactional code here
    }
}

2. 传播和隔离级别

您可以指定事务的传播和隔离级别来控制事务的行为方式:

  • 传播:定义当现有事务已经运行时事务的行为方式。
  • 隔离性:定义事务的数据可见性级别。
java 复制代码
@Transactional(propagation = Propagation.REQUIRED, 
              isolation = Isolation.READ_COMMITTED) 
public  void  createUser () { 
    // 在此处输入您的事务代码
}

3. 回滚规则

您可以指定哪些异常应触发回滚:

java 复制代码
@Transactional(rollbackFor = Exception.class) 
public  void  createUser () { 
    // 此处为你的事务代码
}

4. 只读事务

如果您的方法仅读取数据而不执行任何写入操作,则可以将其标记为只读以进行性能优化:

java 复制代码
@Transactional(readOnly = true) 
public  void  getUser () { 
    // 此处为你的只读代码
}

5. 类上的事务

您还可以将其放置@Transactional在类级别,以将其应用于类中的所有方法:

java 复制代码
@Service 
@Transactional
 public class UserService { 

    public  void  getUser () { 
        // 事务代码
    } 

    public void createUser () { 
        // 事务代码
    } 
}

具有事务方法的示例服务

java 复制代码
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Transactional
    public void saveUser() {
        // 保存数据的代码
    }

    @Transactional(readOnly = true)
    public void fetchUser() {
        // 获取数据的代码
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void newTransaction() {
        // 在新的事务中执行的代码
    }

    @Transactional(rollbackFor = {CustomException.class})
    public void performWithRollback() {
        //可能抛出 CustomException 的危险代码
    }
}

概括

使用@TransactionalSpring Boot,您可以声明式地管理事务,明确指定事务在各种情况下的行为方式。这有助于确保数据一致性并简化应用程序中的错误处理。

相关推荐
9527!到!14 小时前
Springboot @value读取配置参数踩坑&推荐解决方案
java·spring boot·spring
十年Java程序媛14 小时前
Java 面试常问 this、super:构造方法调用顺序避坑
java·开发语言·spring boot·面试·个人开发
小蒜学长17 小时前
基于SpingBoot+Vue的定向越野赛事管理系统的设计与开发(代码+数据库+LW)
java·前端·spring boot·后端·前后端分离·定向越野赛事
RuoyiOffice17 小时前
项目预算和交付日期变了,为什么不能直接改台账?
spring boot·项目管理·vue3·flowable·业务建模·ruoyi office·项目变更
小蒜学长17 小时前
基于过程性评价的ai助学平台(代码+数据库+LW)
java·spring boot·后端·微信小程序·过程性评价
博风18 小时前
使用Spring官网下载Springboot骨架
java·spring boot·spring
木井巳19 小时前
【JavaEE】SpringBoot 统一功能处理: 拦截器、统一返回与全局异常
java·spring boot·后端·spring·java-ee
Thomas.Sir20 小时前
第6课:SpringBoot4.x 核心注解全解:Component、Bean、Scope、Lazy等IOC相关注解
java·spring boot
paopaokaka_luck20 小时前
美食推荐系统(协同过滤算法推荐、AI助手、HanLP中文分词、 ECharts可视化分析、菜谱学习与话题交流)
java·spring boot·mysql·tomcat·echarts
相隔一个图书馆的距离21 小时前
单测(三)Spring Boot 3.5.6 && @MockitoSpyBean / AOP / 循环依赖:静默吞错与运行期 NPE
java·spring boot·后端