`

spring @Transaction事务不生效问题

阅读更多
如果你已经排除了以下问题:
https://blog.csdn.net/qq_20597727/article/details/84900994

或是数据库本身不支持, 如MySQL的Myisam.

不防看看是不是由多数据源引起的:

多数据源我们一般这样配置:

@Configuration
    @EnableDataSource("A")
    @EnableJpaRepositories(
        repositoryFactoryBeanClass = CustomRepositoryFactoryBean.class,
        entityManagerFactoryRef = "defaultEntityManagerFactory",
        basePackages = {"com.A.dao"},
        transactionManagerRef = "defaultTransactionManager"
    )
    @ConditionalOnProperty(
        prefix = "XXX.datasource.default",
        name = {"driverClassName", "url", "username", "password"}
    )
    protected static class DataSourceDefaultConfiguration {
        private static final Logger log = LoggerFactory.getLogger(DataSourceConfiguration.DataSourceDefaultConfiguration.class);

        protected DataSourceDefaultConfiguration() {
        }
    }

@Configuration
    @EnableDataSource("B")
    @EnableJpaRepositories(
        repositoryFactoryBeanClass = CustomRepositoryFactoryBean.class,
        entityManagerFactoryRef = "myGblEntityManagerFactory",
        basePackages = {"com.B.dao"},
        transactionManagerRef = "myGblTransactionManager"
    )
    @ConditionalOnProperty(
        prefix = "XXX.datasource.myGbl",
        name = {"driverClassName", "url", "username", "password"}
    )
    protected static class DataSourceMyGblConfiguration {
        private static final Logger log = LoggerFactory.getLogger(DataSourceConfiguration.DataSourceMyGblConfiguration.class);

        protected DataSourceMyGblConfiguration() {
        }
    }


这样, 其中一个数据源就是默认的数据源, 如A. 如果使用@Transaction注解开启事务, 默认使用默认数据源A来进行开启, 提交, 回滚 事务, 这个时候如果@Transaction方法里面是对com.B.dao进行的操作, 那么其实事务也是作用在A数据源上, 就会产生事务不生效的假象.
这时需指定事务对象来声明事务: @Transactional(value = "myGblTransactionManager"), 这时事务会作用在com.B.dao的操作上.


关于事务是否生效, 可以从这里入手检查:
org.springframework.orm.jpa.JpaTransactionManager

@Override
	protected void doBegin(Object transaction, TransactionDefinition definition) {
		JpaTransactionObject txObject = (JpaTransactionObject) transaction;

		if (txObject.hasConnectionHolder() && !txObject.getConnectionHolder().isSynchronizedWithTransaction()) {
			throw new IllegalTransactionStateException(
					"Pre-bound JDBC Connection found! JpaTransactionManager does not support " +
					"running within DataSourceTransactionManager if told to manage the DataSource itself. " +
					"It is recommended to use a single JpaTransactionManager for all transactions " +
					"on a single DataSource, no matter whether JPA or JDBC access.");
		}

		try {
			if (!txObject.hasEntityManagerHolder() ||
					txObject.getEntityManagerHolder().isSynchronizedWithTransaction()) {

如果是非JpaTransactionManager, 可以从其接口入手PlatformTransactionManager
分享到:
评论

相关推荐

    Spring 常用 Transaction Annotation

    本篇主要聚焦于"Spring 常用 Transaction Annotation",即声明式事务管理,这是一种更简洁、易于维护的事务控制方式。 首先,Spring的声明式事务管理基于AOP(面向切面编程),它允许我们在不修改业务代码的情况下...

    Spring事务不生效.pdf

    通过理解以上这些常见问题,开发者可以更好地预防和解决Spring事务不生效的问题,确保应用的事务处理正常运行,保持数据的一致性和完整性。在实际开发中,细心检查和配置事务管理,避免潜在的陷阱,是保证系统稳定性...

    关于Spring注解@Async引发其他注解失效的解决

    Spring 框架提供了多种注解来帮助开发者简化代码,例如 @Async 用于异步执行方法、@Transaction 用于事务管理等。但是,在使用这些注解时,可能会遇到一些问题,例如 @Async 注解引发其他注解失效的问题。 在文章中...

    SpringCloud Alibaba使用(四) - seata分布式事务.zip

    Transaction Coordinator(TC) :事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚; Transaction Manager(TM) :控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚...

    Spring基于XML方式配置事务

    在Spring框架中,事务管理是核心功能之一,它允许开发者以声明式或编程式的方式处理应用程序的事务。这里我们主要探讨的是"Spring基于XML方式配置事务",这涉及到Spring的事务管理器、事务属性以及如何在XML配置文件...

    spring-hibernate-maven-transaction整合

    此外,Spring还支持AOP(Aspect-Oriented Programming),允许我们在不影响业务逻辑的情况下处理横切关注点,如日志、事务管理等。 2. **Hibernate**:Hibernate是一个对象关系映射(ORM)框架,它将Java对象映射到...

    Spring3事务管理——使用@Transactional 注解.rar

    - `@Transactional`注解仅在Spring AOP代理能够拦截到的方法上生效,因此,如果在非Spring管理的类或静态方法中使用,事务管理将不起作用。 - 如果事务属性设置不当,可能会导致数据不一致或并发问题,应谨慎调整...

    spring声明式事务.zip

    此外,对于非Spring管理的bean,声明式事务可能无法生效。 7. **最佳实践** 在实际项目中,推荐结合使用基于XML和注解的声明式事务管理。对于事务管理的核心逻辑,如事务传播行为和隔离级别,可以在XML配置中统一...

    Spring @Transactional注解失效解决方案

    Spring @Transactional 注解失效解决方案 ...通过了解 @Transactional 注解的特性和事务传播模式,并遵循解决方案,我们可以解决 @Transactional 注解不回滚的问题,确保事务管理的正确性和可靠性。

    spring1.2申明式事务.txt

    为了使声明式事务生效,还需要配置一个`BeanNameAutoProxyCreator`,它会根据指定的bean名称为相应的bean创建事务代理: ```xml <bean id="beanautoproxy" class="org.springframework.aop.framework.autoproxy....

    狂神 Spring5课堂笔记

    - **事务管理**:Spring提供了对各种数据访问技术的统一事务管理机制,包括JDBC、Hibernate、JPA等,使得事务管理变得更加简单和一致。 #### 3. Spring框架的组成部分 根据提供的图表,Spring框架主要包括以下几个...

    S详细讲解SH中Spring事务流程.doc

    在开发过程中,理解Spring事务管理的工作原理和配置方式至关重要,因为事务管理是保证数据完整性的基石,尤其在多线程和并发环境下,正确地管理事务对于防止数据不一致至关重要。通过合理的配置和使用,我们可以确保...

    spring3+hibernate4配置声明式事务管理(annotation方式)

    最后,启动Spring容器并运行应用,事务管理功能就会生效。 通过这个小实例工程,我们可以学习到如何在Spring 3和Hibernate 4中利用注解实现声明式事务管理,这对于提升代码的可读性和可维护性至关重要。在实际项目...

    transaction.zip

    对于`private`或包私有方法,事务不会生效,因为Spring的AOP代理无法拦截这些方法。 - 事务的回滚通常由未被捕获的运行时异常触发。如果捕获了异常并返回,事务可能不会回滚,除非在`rollbackFor`中显式指定该异常...

    spring_part2

    在文件"spring_06_transaction"中,我们可能看到关于Spring的声明式事务管理的详细解释,包括如何使用@Transactional注解,以及如何在XML配置文件中定义事务切面。这些内容将帮助我们理解如何在不修改业务代码的情况...

    这一次搞懂Spring事务注解的解析方式

    - 事务注解不在正确的位置:只有在接口实现类的方法或者类级别才能生效,如果在接口上使用,不会被Spring识别。 - 事务管理器未正确配置或未引入:必须在Spring配置中指定有效的`PlatformTransactionManager`。 -...

    Spring通过AOP实现Hibernate自动事务.rar

    而Spring的AOP可以解决这个问题,它可以在合适的时候自动插入事务管理代码,使得事务处理与业务逻辑分离。 接下来,我们将探讨如何配置Spring以使用AOP进行Hibernate事务管理。首先,需要在Spring的配置文件中声明...

    springmvc事务配置到controller.zip

    为了使Controller层的事务注解生效,我们需要在Spring的配置文件中启用事务代理。这通常通过`<tx:annotation-driven>`标签完成,如下所示: ```xml <beans xmlns="http://www.springframework.org/schema/beans" ...

    springcloud-nacos-seata.zip

    - **AT事务(Automatic Transaction Mode)**:Seata中的默认模式,它采用基于Saga的长事务,通过自动补偿来实现分布式事务。AT模式简化了开发者的工作,但在事务回滚时可能会有数据不一致的风险。 - **TCC事务...

    事务的使用方法

    需要注意的是,当使用`@Transactional`注解时,事务对整个方法生效。这意味着方法中的所有数据操作都会被包含在一个事务内。此外,对于`@Transactional`注解的使用,还需要注意以下几点: - 当方法抛出未检查异常...

Global site tag (gtag.js) - Google Analytics