Spring的事务传播机制和隔离级别

Spring 提供了强大的事务管理机制,通过 @Transactional 注解或程序化事务管理方式,开发者可以轻松地在应用中启用事务特性。事务传播机制和隔离级别是 Spring 事务管理中的两个重要方面,了解它们有助于更好地控制事务的行为,确保数据的一致性和完整性。

1. 事务传播机制(Transaction Propagation)

事务传播机制定义了当一个事务方法被另一个事务方法调用时,事务如何传播。Spring 提供了七种事务传播行为:

1.1 PROPAGATION_REQUIRED

如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。大多数情况下,这是默认的传播行为。

1.2 PROPAGATION_REQUIRES_NEW

总是创建一个新的事务。如果当前存在事务,则将当前事务挂起。在嵌套事务中较为常用。

1.3 PROPAGATION_SUPPORTS

如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。

1.4 PROPAGATION_NOT_SUPPORTED

总是以非事务方式执行,如果当前存在事务,则将当前事务挂起。

1.5 PROPAGATION_NEVER

总是以非事务方式执行,如果当前存在事务,则抛出异常。

1.6 PROPAGATION_MANDATORY

如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

1.7 PROPAGATION_NESTED

如果当前存在事务,则创建一个嵌套事务(使用保存点);如果当前没有事务,则创建一个新的事务。需要底层数据库支持嵌套事务。

2. 事务隔离级别(Transaction Isolation Level)

事务隔离级别定义了一个事务可以看到其他事务的哪些数据状态。隔离级别越高,数据一致性越好,但并发性能越低。Spring 支持以下五种隔离级别:

2.1 ISOLATION_DEFAULT

使用底层数据库的默认隔离级别。大多数数据库的默认隔离级别是 READ_COMMITTED

2.2 ISOLATION_READ_UNCOMMITTED

最低的隔离级别,允许读取未提交的数据(脏读)。可能会导致脏读、不可重复读和幻读。

2.3 ISOLATION_READ_COMMITTED

允许读取已提交的数据,防止脏读。可能会导致不可重复读和幻读。

2.4 ISOLATION_REPEATABLE_READ

防止脏读和不可重复读。可能会导致幻读。

2.5 ISOLATION_SERIALIZABLE

最高的隔离级别,完全锁定相关数据,防止脏读、不可重复读和幻读。这是最慢的隔离级别,但确保了最高的数据一致性。

示例代码

以下是一个示例代码,展示了如何使用 @Transactional 注解来配置事务传播机制和隔离级别:

复制代码

java复制代码

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @Service public class TransactionalService { @Autowired private JdbcTemplate jdbcTemplate; @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED) public void methodA() { // 执行一些数据库操作 jdbcTemplate.update("UPDATE account SET balance = balance - 100 WHERE id = 1"); methodB(); } @Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE) public void methodB() { // 执行一些数据库操作 jdbcTemplate.update("UPDATE account SET balance = balance + 100 WHERE id = 2"); } }

主程序
复制代码

java复制代码

import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class TransactionalExample { public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); TransactionalService transactionalService = context.getBean(TransactionalService.class); transactionalService.methodA(); } }

配置类
复制代码

java复制代码

import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.support.TransactionTemplate; import javax.sql.DataSource; @Configuration @EnableTransactionManagement public class AppConfig { @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/testdb"); dataSource.setUsername("username"); dataSource.setPassword("password"); return dataSource; } @Bean public PlatformTransactionManager transactionManager() { return new org.springframework.jdbc.datasource.DataSourceTransactionManager(dataSource()); } @Bean public JdbcTemplate jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } }

总结

Spring 提供了强大的事务管理机制,通过 @Transactional 注解可以方便地配置事务传播行为和隔离级别:

  1. 事务传播机制 :定义了事务方法在被另一个事务方法调用时的行为。常见的传播行为包括 PROPAGATION_REQUIREDPROPAGATION_REQUIRES_NEWPROPAGATION_SUPPORTS 等。
  2. 事务隔离级别 :定义了一个事务对其他事务的可见性。常见的隔离级别包括 ISOLATION_READ_UNCOMMITTEDISOLATION_READ_COMMITTEDISOLATION_REPEATABLE_READISOLATION_SERIALIZABLE

了解事务传播机制和隔离级别有助于写出更健壮和高效的事务管理代码,确保数据的一致性和完整性。

Spring 提供了强大的事务管理机制,通过 @Transactional 注解或程序化事务管理方式,开发者可以轻松地在应用中启用事务特性。事务传播机制和隔离级别是 Spring 事务管理中的两个重要方面,了解它们有助于更好地控制事务的行为,确保数据的一致性和完整性。

1. 事务传播机制(Transaction Propagation)

事务传播机制定义了当一个事务方法被另一个事务方法调用时,事务如何传播。Spring 提供了七种事务传播行为:

1.1 PROPAGATION_REQUIRED

如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。大多数情况下,这是默认的传播行为。

1.2 PROPAGATION_REQUIRES_NEW

总是创建一个新的事务。如果当前存在事务,则将当前事务挂起。在嵌套事务中较为常用。

1.3 PROPAGATION_SUPPORTS

如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。

1.4 PROPAGATION_NOT_SUPPORTED

总是以非事务方式执行,如果当前存在事务,则将当前事务挂起。

1.5 PROPAGATION_NEVER

总是以非事务方式执行,如果当前存在事务,则抛出异常。

1.6 PROPAGATION_MANDATORY

如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

1.7 PROPAGATION_NESTED

如果当前存在事务,则创建一个嵌套事务(使用保存点);如果当前没有事务,则创建一个新的事务。需要底层数据库支持嵌套事务。

2. 事务隔离级别(Transaction Isolation Level)

事务隔离级别定义了一个事务可以看到其他事务的哪些数据状态。隔离级别越高,数据一致性越好,但并发性能越低。Spring 支持以下五种隔离级别:

2.1 ISOLATION_DEFAULT

使用底层数据库的默认隔离级别。大多数数据库的默认隔离级别是 READ_COMMITTED

2.2 ISOLATION_READ_UNCOMMITTED

最低的隔离级别,允许读取未提交的数据(脏读)。可能会导致脏读、不可重复读和幻读。

2.3 ISOLATION_READ_COMMITTED

允许读取已提交的数据,防止脏读。可能会导致不可重复读和幻读。

2.4 ISOLATION_REPEATABLE_READ

防止脏读和不可重复读。可能会导致幻读。

2.5 ISOLATION_SERIALIZABLE

最高的隔离级别,完全锁定相关数据,防止脏读、不可重复读和幻读。这是最慢的隔离级别,但确保了最高的数据一致性。

示例代码

以下是一个示例代码,展示了如何使用 @Transactional 注解来配置事务传播机制和隔离级别:

复制代码

java复制代码

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @Service public class TransactionalService { @Autowired private JdbcTemplate jdbcTemplate; @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED) public void methodA() { // 执行一些数据库操作 jdbcTemplate.update("UPDATE account SET balance = balance - 100 WHERE id = 1"); methodB(); } @Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE) public void methodB() { // 执行一些数据库操作 jdbcTemplate.update("UPDATE account SET balance = balance + 100 WHERE id = 2"); } }

主程序
复制代码

java复制代码

import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class TransactionalExample { public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); TransactionalService transactionalService = context.getBean(TransactionalService.class); transactionalService.methodA(); } }

配置类
复制代码

java复制代码

import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.support.TransactionTemplate; import javax.sql.DataSource; @Configuration @EnableTransactionManagement public class AppConfig { @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/testdb"); dataSource.setUsername("username"); dataSource.setPassword("password"); return dataSource; } @Bean public PlatformTransactionManager transactionManager() { return new org.springframework.jdbc.datasource.DataSourceTransactionManager(dataSource()); } @Bean public JdbcTemplate jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } }

总结

Spring 提供了强大的事务管理机制,通过 @Transactional 注解可以方便地配置事务传播行为和隔离级别:

  1. 事务传播机制 :定义了事务方法在被另一个事务方法调用时的行为。常见的传播行为包括 PROPAGATION_REQUIREDPROPAGATION_REQUIRES_NEWPROPAGATION_SUPPORTS 等。
  2. 事务隔离级别 :定义了一个事务对其他事务的可见性。常见的隔离级别包括 ISOLATION_READ_UNCOMMITTEDISOLATION_READ_COMMITTEDISOLATION_REPEATABLE_READISOLATION_SERIALIZABLE

了解事务传播机制和隔离级别有助于写出更健壮和高效的事务管理代码,确保数据的一致性和完整性。

相关推荐
蓝-萧6 分钟前
【玩转全栈】----Django基本配置和介绍
java·后端
priority_key6 分钟前
排序算法:堆排序、快速排序、归并排序
java·后端·算法·排序算法·归并排序·堆排序·快速排序
韩立学长6 分钟前
基于Springboot的旧时月历史论坛4099k6s9(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
葡萄城技术团队39 分钟前
迎接下一代 React 框架:Next.js 16 核心能力解读
javascript·spring·react.js
TDengine (老段)1 小时前
TDengine 字符串函数 CONCAT_WS 用户手册
android·大数据·数据库·时序数据库·tdengine·涛思数据
汤姆yu1 小时前
基于SpringBoot的动漫周边商场系统的设计与开发
java·spring boot·后端
皮皮林5511 小时前
快速解决 Maven 版本冲突指南 !
java·maven
IT 小阿姨(数据库)2 小时前
PostgreSQL 之上的开源时序数据库 TimescaleDB 详解
运维·数据库·sql·postgresql·开源·centos·时序数据库
灰小猿2 小时前
Spring前后端分离项目时间格式转换问题全局配置解决
java·前端·后端·spring·spring cloud
算法与编程之美2 小时前
理解Java finalize函数
java·开发语言·jvm·算法