如果你已经排除了以下问题:
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的声明式事务管理基于AOP(面向切面编程),它允许我们在不修改业务代码的情况下...
通过理解以上这些常见问题,开发者可以更好地预防和解决Spring事务不生效的问题,确保应用的事务处理正常运行,保持数据的一致性和完整性。在实际开发中,细心检查和配置事务管理,避免潜在的陷阱,是保证系统稳定性...
Transaction Coordinator(TC) :事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚; Transaction Manager(TM) :控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚...
在Spring框架中,事务管理是核心功能之一,它允许开发者以声明式或编程式的方式处理应用程序的事务。这里我们主要探讨的是"Spring基于XML方式配置事务",这涉及到Spring的事务管理器、事务属性以及如何在XML配置文件...
此外,Spring还支持AOP(Aspect-Oriented Programming),允许我们在不影响业务逻辑的情况下处理横切关注点,如日志、事务管理等。 2. **Hibernate**:Hibernate是一个对象关系映射(ORM)框架,它将Java对象映射到...
- `@Transactional`注解仅在Spring AOP代理能够拦截到的方法上生效,因此,如果在非Spring管理的类或静态方法中使用,事务管理将不起作用。 - 如果事务属性设置不当,可能会导致数据不一致或并发问题,应谨慎调整...
此外,对于非Spring管理的bean,声明式事务可能无法生效。 7. **最佳实践** 在实际项目中,推荐结合使用基于XML和注解的声明式事务管理。对于事务管理的核心逻辑,如事务传播行为和隔离级别,可以在XML配置中统一...
Spring @Transactional 注解失效解决方案 ...通过了解 @Transactional 注解的特性和事务传播模式,并遵循解决方案,我们可以解决 @Transactional 注解不回滚的问题,确保事务管理的正确性和可靠性。
为了使声明式事务生效,还需要配置一个`BeanNameAutoProxyCreator`,它会根据指定的bean名称为相应的bean创建事务代理: ```xml <bean id="beanautoproxy" class="org.springframework.aop.framework.autoproxy....
- **事务管理**:Spring提供了对各种数据访问技术的统一事务管理机制,包括JDBC、Hibernate、JPA等,使得事务管理变得更加简单和一致。 #### 3. Spring框架的组成部分 根据提供的图表,Spring框架主要包括以下几个...
在开发过程中,理解Spring事务管理的工作原理和配置方式至关重要,因为事务管理是保证数据完整性的基石,尤其在多线程和并发环境下,正确地管理事务对于防止数据不一致至关重要。通过合理的配置和使用,我们可以确保...
最后,启动Spring容器并运行应用,事务管理功能就会生效。 通过这个小实例工程,我们可以学习到如何在Spring 3和Hibernate 4中利用注解实现声明式事务管理,这对于提升代码的可读性和可维护性至关重要。在实际项目...
对于`private`或包私有方法,事务不会生效,因为Spring的AOP代理无法拦截这些方法。 - 事务的回滚通常由未被捕获的运行时异常触发。如果捕获了异常并返回,事务可能不会回滚,除非在`rollbackFor`中显式指定该异常...
在文件"spring_06_transaction"中,我们可能看到关于Spring的声明式事务管理的详细解释,包括如何使用@Transactional注解,以及如何在XML配置文件中定义事务切面。这些内容将帮助我们理解如何在不修改业务代码的情况...
- 事务注解不在正确的位置:只有在接口实现类的方法或者类级别才能生效,如果在接口上使用,不会被Spring识别。 - 事务管理器未正确配置或未引入:必须在Spring配置中指定有效的`PlatformTransactionManager`。 -...
而Spring的AOP可以解决这个问题,它可以在合适的时候自动插入事务管理代码,使得事务处理与业务逻辑分离。 接下来,我们将探讨如何配置Spring以使用AOP进行Hibernate事务管理。首先,需要在Spring的配置文件中声明...
为了使Controller层的事务注解生效,我们需要在Spring的配置文件中启用事务代理。这通常通过`<tx:annotation-driven>`标签完成,如下所示: ```xml <beans xmlns="http://www.springframework.org/schema/beans" ...
- **AT事务(Automatic Transaction Mode)**:Seata中的默认模式,它采用基于Saga的长事务,通过自动补偿来实现分布式事务。AT模式简化了开发者的工作,但在事务回滚时可能会有数据不一致的风险。 - **TCC事务...
需要注意的是,当使用`@Transactional`注解时,事务对整个方法生效。这意味着方法中的所有数据操作都会被包含在一个事务内。此外,对于`@Transactional`注解的使用,还需要注意以下几点: - 当方法抛出未检查异常...