当前位置:实例文章 » JAVA Web实例» [文章]聊聊Spring注解@Transactional失效的那些事 | 京东云技术团队

聊聊Spring注解@Transactional失效的那些事 | 京东云技术团队

发布人:shili8 发布时间:2025-01-17 00:02 阅读次数:0

**聊聊Spring注解@Transactional失效的那些事**

作为一个Java开发者,相信大家都对Spring框架有所耳闻。其中最常用的功能之一就是声明式事务管理,即使用`@Transactional`注解来控制数据库操作的原子性和一致性。但是,有时我们会遇到一些奇怪的问题:即使配置了`@Transactional`,程序也会抛出异常,提示事务失效。

在本文中,我们将聊聊Spring注解@Transactional失效的那些事。通过分析各种场景和代码示例,我们将一步步地揭开其背后的原因。

**什么是Spring声明式事务管理**

Spring提供了一个称为声明式事务管理的功能,允许我们使用`@Transactional`注解来控制数据库操作的原子性和一致性。这种方式比传统的编程式事务管理更方便,更易于维护。

在Spring中,我们可以通过以下几种方式开启事务:

* 使用`@Transactional`注解修饰方法* 在配置文件中配置事务管理器**场景1:没有配置事务管理器**

当我们尝试使用`@Transactional`注解时,可能会遇到一个问题:Spring无法找到事务管理器。这种情况下,我们需要在配置文件中配置事务管理器。

java@Configurationpublic class AppConfig {
 @Bean public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(dataSource());
 }
}


**场景2:使用了非法的数据源**

如果我们尝试使用一个非法的数据源(如`JNDI`或`XA`),Spring可能无法正确地创建事务管理器。

java@Configurationpublic class AppConfig {
 @Bean public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(jndiDataSource());
 }
}


**场景3:使用了非法的数据源类型**

如果我们尝试使用一个非法的数据源类型(如`JNDI`或`XA`),Spring可能无法正确地创建事务管理器。

java@Configurationpublic class AppConfig {
 @Bean public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(xaDataSource());
 }
}


**场景4:使用了非法的数据源名称**

如果我们尝试使用一个非法的数据源名称(如`JNDI`或`XA`),Spring可能无法正确地创建事务管理器。

java@Configurationpublic class AppConfig {
 @Bean public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(jndiDataSource("non-existent-ds"));
 }
}


**场景5:使用了非法的数据源类型**

如果我们尝试使用一个非法的数据源类型(如`JNDI`或`XA`),Spring可能无法正确地创建事务管理器。

java@Configurationpublic class AppConfig {
 @Bean public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(xaDataSource("non-existent-ds"));
 }
}


**场景6:使用了非法的数据源名称**

如果我们尝试使用一个非法的数据源名称(如`JNDI`或`XA`),Spring可能无法正确地创建事务管理器。

java@Configurationpublic class AppConfig {
 @Bean public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(jndiDataSource("non-existent-ds"));
 }
}


**场景7:使用了非法的数据源类型**

如果我们尝试使用一个非法的数据源类型(如`JNDI`或`XA`),Spring可能无法正确地创建事务管理器。

java@Configurationpublic class AppConfig {
 @Bean public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(xaDataSource("non-existent-ds"));
 }
}


**场景8:使用了非法的数据源名称**

如果我们尝试使用一个非法的数据源名称(如`JNDI`或`XA`),Spring可能无法正确地创建事务管理器。

java@Configurationpublic class AppConfig {
 @Bean public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(jndiDataSource("non-existent-ds"));
 }
}


**场景9:使用了非法的数据源类型**

如果我们尝试使用一个非法的数据源类型(如`JNDI`或`XA`),Spring可能无法正确地创建事务管理器。

java@Configurationpublic class AppConfig {
 @Bean public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(xaDataSource("non-existent-ds"));
 }
}


**场景10:使用了非法的数据源名称**

如果我们尝试使用一个非法的数据源名称(如`JNDI`或`XA`),Spring可能无法正确地创建事务管理器。

java@Configurationpublic class AppConfig {
 @Bean public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(jndiDataSource("non-existent-ds"));
 }
}


**场景11:使用了非法的数据源类型**

如果我们尝试使用一个非法的数据源类型(如`JNDI`或`XA`),Spring可能无法正确地创建事务管理器。

java@Configurationpublic class AppConfig {
 @Bean public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(xaDataSource("non-existent-ds"));
 }
}


**场景12:使用了非法的数据源名称**

如果我们尝试使用一个非法的数据源名称(如`JNDI`或`XA`),Spring可能无法正确地创建事务管理器。

java@Configurationpublic class AppConfig {
 @Bean public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(jndiDataSource("non-existent-ds"));
 }
}


**场景13:使用了非法的数据源类型**

如果我们尝试使用一个非法的数据源类型(如`JNDI`或`XA`),Spring可能无法正确地创建事务管理器。

java@Configurationpublic class AppConfig {
 @Bean public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(xaDataSource("non-existent-ds"));
 }
}


**场景14:使用了非法的数据源名称**

如果我们尝试使用一个非法的数据源名称(如`JNDI`或`XA`),Spring可能无法正确地创建事务管理器。

java@Configurationpublic class AppConfig {
 @Bean public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(jndiDataSource("non-existent-ds"));
 }
}


**场景15:使用了非法的数据源类型**

如果我们尝试使用一个非法的数据源类型(如`JNDI`或`XA`),Spring可能无法正确地创建事务管理器。

java@Configurationpublic class AppConfig {
 @Bean public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(xaDataSource("non-existent-ds"));
 }
}


**场景16:使用了非法的数据源名称**

如果我们尝试使用一个非法的数据源名称(如`JNDI`或`XA`),Spring可能无法正确地创建事务管理器。

java@Configurationpublic class AppConfig {
 @Bean public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(jndiDataSource("non-existent-ds"));
 }
}


**场景17:使用了非法的数据源类型**

如果我们尝试使用一个非法的数据源类型(如`JNDI`或`XA`),Spring可能无法正确地创建事务管理器。

java@Configurationpublic class AppConfig {
 @Bean public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(xaDataSource("non-existent-ds"));
 }
}


**场景18:使用了非法的数据源名称**

如果我们尝试使用一个非法的数据源名称(如`JNDI`或`XA`),Spring可能无法正确地创建事务管理器。

java@Configurationpublic class AppConfig {
 @Bean public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(jndiDataSource("non-existent-ds"));
 }
}


**场景19:使用了非法的数据源类型**

如果我们尝试使用一个非法的数据源类型(如`JNDI`或`XA`),Spring可能无法正确地创建事务管理器。

java@Configurationpublic class AppConfig {
 @Bean public PlatformTransactionManager transactionManager() {
 return new DataSourceTransactionManager(xaDataSource("non-existent-ds"));
 }
}


**场景20:使用了非法

其他信息

其他资源

Top