简单了解Spring中的事务控制

简单了解Spring中的事务控制

Spring作为一款优秀的 Java 开发框架,提供了非常完善的数据访问和事务控制支持。Spring 的事务控制主要是通过AOP(面向切面编程)实现,易于扩展,功能强大。

什么是事务

事务是指一组要么全部执行成功,要么全部回滚的一组数据库操作。在Java应用程序中,事务的支持是非常重要和必要的,会话中出现故障或意外错误时,可以防止数据损坏或不一致情况的发生。

Spring的事务控制

Spring的事务控制非常简单,主要使用@Transactional注解,支持非常多的配置。下面列举一些常用操作和配置。

1. 开启事务

在要进行事务控制的方法上面添加@Transactional注解即可开启事务控制。如下所示:

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

2. 声明事务的传播特性

事务的传播特性是指:当一个事务方法(声明了@Transaction注解)被另一个事务方法调用时,如何处理事务。

常用的传播特性如下:

  • PROPAGATION_REQUIRED:支持当前事务,如果不存在则创建新事务。
  • PROPAGATION_SUPPORTS:支持当前事务,如果不存在则不使用事务。
  • PROPAGATION_MANDATORY:支持当前事务,如果不存在则抛出异常。
  • PROPAGATION_REQUIRES_NEW:创建新事务,如果当前存在事务则挂起。
  • PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果存在事务则挂起。
  • PROPAGATION_NEVER: 以非事务方式运行,如果存在事务则抛出异常。
  • PROPAGATION_NESTED:如果当前事务存在,则在嵌套事务内执行。如果当前事务不存在,则和 PROPAGATION_REQUIRED 行为相同。

使用示例如下:

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // do something
    methodB();
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
    // do something else
}

在该示例中,methodB()methodA()调用。methodA()声明了传播特性为PROPAGATION_REQUIREDmethodB()的传播特性为PROPAGATION_REQUIRES_NEW。这意味着,当执行 methodB() 时,Spring 将先暂停执行(methodA()中的事务),然后再开启一个新的事务并执行methodB()

3. 设置事务超时时间

可以通过@Transactional注解的timeout属性设置事务超时时间,单位是秒。如下所示:

@Transactional(timeout = 30)
public void someMethod() {
    // do something
}

在该示例中,someMethod()的事务超时时间为30秒。

事务控制的注意事项

  1. @Transactional注解只能应用于公共方法。
  2. 不要让事务方法抛出异常,这可能会导致事务回滚。如果必须抛出异常,请将异常转换为 Spring 异常。
  3. Spring默认将捕获RuntimeExceptionError来回滚事务。
  4. 默认情况下,Spring的事务控制仅回滚未受检查异常。如果你要让事务回滚所有异常,则需要在@Transactional注解上添加rollbackFor属性。

示例

以下是一个简单的Spring事务控制示例,用于向数据库中插入用户信息:

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void saveUser(User user) throws Exception {
        userDao.save(user);
        if(user.getName().equals("admin")) {
            throw new Exception("用户名不能是admin!");
        }
    }
}

在该示例中,saveUser()方法声明了传播特性为PROPAGATION_REQUIRED,并设置了rollbackFor属性来让事务在抛出异常时回滚。

在执行saveUser()时,如果插入的用户信息的名称是admin,则会抛出异常,事务将回滚,数据不会插入到数据库中。

@Service
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/saveUser")
    public String saveUser(User user) {
        try {
            userService.saveUser(user);
        } catch (Exception e) {
            return "error";
        }
        return "success";
    }
}

在该示例中,UserController调用UserServicesaveUser()方法,如果插入过程中出现异常,则返回错误信息;否则返回success

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:简单了解Spring中的事务控制 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • redis中的设置bind绑定ip不是设置白名单

    在redis的network设置中如果没有通过bind绑定ip, 并且也没有配置密码, 那么保护模式就开启, 只允许本机访问. 这里设置bind绑定ip, 绑定的一样是本机ip, 只是本机有多个ip, 选绑定. 而不是指白名单, 只有绑定后的主机才能访问该redis服务, 而是要想访问该redis只能通过该ip. 例如如果设置了band 127.0.0.1,…

    Redis 2023年4月12日
    00
  • Linux shell操作mysql数据库深入解析

    下面是“Linux shell操作mysql数据库深入解析”的完整攻略,包括以下几个部分: 安装mysql客户端 连接到mysql服务器 查询数据库和表信息 执行SQL语句 操作表数据 退出mysql客户端 1. 安装mysql客户端 在 Linux shell 中安装 mysql 客户端,可以使用命令: sudo apt-get install mysql…

    database 2023年5月21日
    00
  • MySQL 中索引是如何实现的,有哪些类型的索引,如何进行优化索引

    MySQL 中的索引 前言 索引的实现 哈希索引 全文索引 B+ 树索引 索引的分类 聚簇索引(clustered index) 非聚簇索引(non-clustered index) 联合索引 覆盖索引 回表查询 explain 使用 索引优化 索引下推 给字符串字段加索引 MySQL 中的 count 查询 MySQL 中的 order by 主键选择自增…

    2023年4月8日
    00
  • MySQL和MongoDB设计实例对比分析

    MySQL和MongoDB设计实例对比分析 引言 MySQL和MongoDB是两个非常流行的数据库管理系统。MySQL是一个关系型数据库管理系统,最初由瑞典MySQL AB开发,现已成为Oracle Corporation的一部分。MongoDB是一种文档数据库管理系统,由MongoDB Inc开发并维护。本文将比较这两个数据库系统在设计和实现方面的差异,并…

    database 2023年5月21日
    00
  • MySQL 慢查询日志深入理解

    当MySQL数据库执行查询的时候,如果查询的速度过慢,则会导致响应时间的延迟,影响用户体验,甚至会造成服务的瘫痪。为了解决这个问题,MySQL提供了一个慢查询日志系统,可以帮助我们找到数据库中执行效率低下的语句并进行优化。 如何开启慢查询日志 我们可以通过修改MySQL配置文件来开启慢查询日志。以下是在MySQL 5.x版本上的操作: 找到my.cnf或my…

    database 2023年5月22日
    00
  • RedisAPI原子性操作及原理解析

    RedisAPI原子性操作及原理解析 Redis是一个高性能的键值对存储系统,使用C语言编写,可用作数据库、缓存和消息中间件。Redis提供了一系列API用于对存储在其内存中的数据进行操作,其中一些API支持原子性操作。 原子性操作 Redis中的原子性操作指的是将多项操作看作为一个整体,要么执行全部成功,要么全部失败,并且不会被其他的操作打断。例如,在Re…

    database 2023年5月22日
    00
  • SQL检索所有行和列

    SQL是一种用于存储、管理和检索关系型数据库中信息的编程语言。为了检索数据库中的数据,需要进行查询操作。以下是SQL检索所有行和列的方法的完整攻略。 一、使用SELECT语句检索所有行和列 通过使用SELECT语句,可以检索表中的所有行和列。该语句由以下三个主要部分组成: SELECT:该关键字告诉数据库我们要检索数据。 *:通配符表示检索所有列。 FROM…

    database 2023年3月27日
    00
  • 通过Navicat for MySQL远程连接的时候报错mysql 1130的解决方法

    这是一篇关于“通过Navicat for MySQL远程连接的时候报错mysql 1130的解决方法”的攻略,攻略包含以下内容: 问题原因 解决方法 配置允许远程连接的账户和密码 配置服务器的防火墙规则 示例说明 问题原因 当我们在使用Navicat for MySQL远程连接MySQL数据库时,会遇到以下错误: error 1130 (HY000): Ho…

    database 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部