博客
关于我
Spring学习总结(十二):Spring中的事务管理
阅读量:490 次
发布时间:2019-03-07

本文共 2228 字,大约阅读时间需要 7 分钟。

  在上一篇文章中,我们讨论了事务的基本概念和Spring如何解决事务问题。接下来,我们将深入探讨Spring事务管理的核心特性,包括传播行为、隔离级别、超时设置等。理解这些细节对于实现高效的事务管理至关重要。

一、Spring事务属性的详细介绍

Spring事务管理涉及多个关键属性,每个属性都对事务的执行有重要影响。以下是这些属性的详细说明:

(1)事务传播行为(Propagation)

当一个事务方法被另一个事务方法调用时,必须指定事务应该如何传播。Spring定义了七种传播行为,每一种传播行为决定了在已有事务上下文中如何执行方法或新启动的事务。以下是各传播行为的说明:

传播行为 描述
PROPAGATION_REQUIRED required 表示当前方法必须在已有的事务中执行。如果有事务存在,该方法将在该事务中运行;否则,会创建一个新的事务。
PROPAGATION_SUPPORTS supports 表示该方法不需要事务上下文。如果有事务存在,该方法会在现有的事务中执行。如果没有事务,方法会执行并不受事务影响。
PROPAGATION_MANDATORY mandatory 表示该方法必须运行在事务中。如果没有事务正在运行,执行该方法会抛出异常。
PROPAGATION_REQUIRED_NEW required_new 表示当前方法必须运行在它自己的独立的事务中。在这种传播行为中,若已存在当前事务,该方法会暂停当前事务,自己启动一个新的事务。
PROPAGATION_NOT_SUPPORTED not_supported 表示该方法不应该运行在事务上下文中。如果有事务正在运行,该方法会暂停当前事务,并确保在该方法完成后,事务不会继续进行。
PROPAGATION_NEVER never 表示该方法绝对不应该运行在任何事务上下文中。如果有事务正在运行,执行该方法会抛出异常。
PROPAGATION_NESTED nested 表示该方法将嵌套在已有的事务中运行。在这种情况下,嵌套的事务可以独立提交或回滚,而不会影响到外部的事务流程。字符面,传播行为为required时的行为类似于本地方法所在的传播行为

理解这些传播行为对于配置事务方法的调用非常重要,确保事务的正确传播是实现分布式事务的关键。

(2)事务隔离级别(Isolation)

事务隔离级别决定了在并发环境下多个事务之间如何读取和修改数据。Spring支持五种隔离级别,具体取决于数据库的实现和需求。以下是各隔离级别的说明:

  • DEFAULT: 使用数据库的默认隔离级别(通常是读未提交或不可重复读)。默认配置下,Spring通常使用REPEATABLE_READ作为默认隔离级别。
  • READ_UNCOMMITTED: 读取未被提交的数据,可以读取到脏读、幻读或不可重复读的问题。这种级别通常用于高并发场景,但不安全性较低。
  • READ_COMMITTED: 在已提交的事务中读取数据,避免脏读,但仍可能存在不可重复读问题。当采用这种隔离级别时,必须确保事务的持久化(如flush操作发生在提交后).
  • REPEATABLE_READ: 保证同一数据在事务重复读取时保持一致性。如果数据库支持这种隔离级别,自动防止脏读和不可重复读,但可能仍然会发生幻读问题.
  • SERIALIZABLE: 完全服从ACID的隔离要求,确保事务不受干扰。这种隔离级别需要对数据库进行锁定,通常会带来较高的性能成本。

选择合适的隔离级别对数据库性能和应用的安全性有重要影响。在实际应用中,需要根据业务需求和数据库的支持来做出权衡。

(3)事务超时(Timeout)

事务可以设置一个超时,确保事务在一定时间内完成,否则会自动回滚。Spring默认的超时设置为-1(表示无限时间)。可以根据需要设置合适的超时值(以秒为单位)。这种设置有助于防止由于网络问题或数据库连接失效导致的长时间等待。

(4)是否只读(ReadOnly)

默认情况下,事务允许执行读写操作(如查询、插入、更新、删除等)和写操作(如修改、删除等)。在某些场景下,可以设置事务为只读模式,禁止写操作。这在基于读写分离的 cineplanet平台中尤为重要,确保读取和写入操作不会干扰彼此。

(5)事务回滚(rollbackFor)

在配置中,可以指定哪些异常会触发事务回滚。默认情况下,Spring支持最常见的异常类型,如DataSourceException、DataAccessException等。这种配置方式可以使事务管理更加灵活,避免因特定异常类型而导致整个事务被 Rolled Back

(6)事务不回滚(noRollbackFor)

相反地,可以配置哪些异常会不会触发事务回滚。这通常用于处理预期的不可恢复错误,比如与数据库连接不上时或自身错误。需要谨慎处理,因为如果配置不当可能会导致数据腐蚀问题。

二、编程式事务管理

 编程式事务管理是通过在代码中手动管理事务实现的,Spring 提供了 TransactionTemplate 类和 PlatformTransactionManager 类。开发者可以直接使用 TransactionTemplate 来编写事务逻辑,或者作为低级事务管理器使用 PlatformTransactionManager 进行事务管理。以下是编程式事务管理的具体实现方法:

转载地址:http://onrcz.baihongyu.com/

你可能感兴趣的文章
使用 MultiDex 解决 64K 限制
查看>>
Glide4实现网络图片加载进度监听
查看>>