简单了解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日

相关文章

  • 如何使用Python获取MySQL中表中的平均值和总和?

    要使用Python获取MySQL中表中的平均值和总和,可以使用Python的内置模块sqlite3或第三方库mysql-connector-python。以下是使用mysql-connector-python在MySQL中获取表中的平均值和总和完整攻略: 连接 要连接到MySQL,需要提供MySQL的主机、用户名、和密码。可以使用以下代码连接: mysql.…

    python 2023年5月12日
    00
  • rman备份脚本和rman增量备份脚本分享

    RMAN是Oracle官方提供的备份和恢复工具,在数据库备份和恢复方面有着很好的性能和稳定性。因此,Oracle管理员必须掌握RMAN备份和恢复技术。下面是分享两个常用的RMAN备份脚本。 1. RMAN全备份脚本 RMAN全备份脚本是备份整个数据库,包括数据文件、控制文件、归档日志。这个脚本要求在每次备份之前手动修改备份目录、备份标签和备份后是否自动清除过…

    database 2023年5月22日
    00
  • SQL数据库的所有命令(函数、运算符)汇总大全

    SQL数据库是关系型数据库的代表,是管理和操作存储在其中的关系数据的系统,它具有丰富的命令、函数和运算符等,可以完成几乎所有与数据相关的任务。以下是SQL数据库的所有命令、函数和运算符的大全及描述: SQL命令 数据库操作命令 CREATE DATABASE 创建数据库 DROP DATABASE 删除数据库 ALTER DATABASE 修改数据库 表操作…

    database 2023年5月21日
    00
  • Centos 6.7 中 Redis-3.2.8的安装

    关于Redis的简单介绍: 官网:www.redis.io Redis 的特点:   1.支持数据的持久化,持久化方案:aof,RDB两种持久化方案,也就是支持将内存中的数据保存到磁盘中,也就是说,redis服务重启,数据仍旧存在   2.Redis不仅仅支持简单的key-value 类型的数据,同时提供了list,set,zset,hash等数据结构的存储…

    Redis 2023年4月13日
    00
  • MySQL创建数据库表

    MySQL是一种关系型数据库管理系统,用于管理大量的数据。为了存储和管理数据,MySQL有一个重要的组成部分——数据表。 MySQL数据表是数据组织的逻辑单元,其中数据按行和列组织,类似于电子表格或Excel中的表格。在这个表格中,数据按照特定的格式和范围存储、分类和访问。 以下是MySQL创建数据库表的方法。 创建命令 MySQL的创建表命令结构如下所示:…

    MySQL 2023年3月9日
    00
  • Mysql获取指定时间范围数据的各种实例

    以下是关于MySQL获取指定时间范围数据的攻略: 获取指定日期时间范围数据的基本语法 我们可以使用SELECT语句来获取指定时间范围内的数据。基本的语法如下: SELECT column1, column2, … FROM table_name WHERE column_name BETWEEN date1 AND date2; 在上述语句中,我们先指定…

    database 2023年5月22日
    00
  • centos 7.0 编译 安装mysql 5.6.22 过程 已完成~ 成功~ 撒花~

      mysql 下载目录/usr/local/srcmysql 解压目录 /usr/local/bin/mysql GitHub https://github.com/mysql/mysql-server   mysql官网的安装说明http://dev.mysql.com/doc/refman/5.6/en/source-installation.html…

    MySQL 2023年4月13日
    00
  • MySQL修改和删除触发器(DROP TRIGGER)方法详解

    MySQL修改触发器的方法 使用命令SHOW TRIGGERS命令获取已经存在的触发器信息,确定要修改的触发器的名称。例如: SHOW TRIGGERS FROM database_name; 使用ALTER TRIGGER命令更新触发器。例如: ALTER TRIGGER trigger_name ON table_name [AFTER|BEFORE] …

    MySQL 2023年3月10日
    00
合作推广
合作推广
分享本页
返回顶部