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

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

相关推荐
奶糖趣多多43 分钟前
Redis知识点
数据库·redis·缓存
阿伟*rui44 分钟前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
CoderIsArt2 小时前
Redis的三种模式:主从模式,哨兵与集群模式
数据库·redis·缓存
XiaoLeisj3 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck3 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei3 小时前
java的类加载机制的学习
java·学习
师太,答应老衲吧4 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
Yaml45 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~5 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616885 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端