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_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_SUPPORTS 等。
  2. 事务隔离级别 :定义了一个事务对其他事务的可见性。常见的隔离级别包括 ISOLATION_READ_UNCOMMITTED、ISOLATION_READ_COMMITTED、ISOLATION_REPEATABLE_READ 和 ISOLATION_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_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_SUPPORTS 等。
  2. 事务隔离级别 :定义了一个事务对其他事务的可见性。常见的隔离级别包括 ISOLATION_READ_UNCOMMITTED、ISOLATION_READ_COMMITTED、ISOLATION_REPEATABLE_READ 和 ISOLATION_SERIALIZABLE。

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

相关推荐
阳光九叶草LXGZXJ4 小时前
达梦数据库-报错-15-列【XXX】长度超出定义
linux·运维·数据库·sql·学习
字节渡客5 小时前
Redis键明明过期了,业务还在读到旧数据
数据库·redis·spring
daidaidaiyu5 小时前
ThingsBoard 集群的核心逻辑源码分析
java
我可能是个假开发6 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
caoerzhong6 小时前
中小企业上 WMS 该先上哪几块:JeeWMS 开源 Java 仓库管理系统的分批上线清单
java·python·开源
OnlineProxy7 小时前
亚马逊多账号运营:如何在规避“关联封号”风险的同时实现电商规模化扩张
服务器·数据库·redis
【JAVA】玩家7 小时前
Spring核心原理全解析:从零到生产实战
java·后端·spring
Wang's Blog8 小时前
Java框架 SpringCloud 快速入门: 实现 Feign 最佳实践(抽取方式)
java·spring cloud
辻弋2018 小时前
五年前的旅行视频糊成马赛克?Video2X用Real-ESRGAN逐帧重建细节,但只支持Windows、集显用户建议直接放弃
服务器·数据库·windows·游戏引擎·电脑
MandalaO_O9 小时前
IDEA 开发(快捷键 + 调试 + 序列化)
java·ide·intellij-idea