`
assen
  • 浏览: 62215 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

@Transactional配置事务不生效

阅读更多
配置Spring的@Transactional注解事务后,实际业务操作是会不生效,原因可能有如下:

原因一:工程中有连接多个不同数据源,如:数据库A和数据库B,且具体的业务方法只处理单数据库A或B的数据,需要在调用方法的@Transactional中指定具体的数据库A或B的事务配置

application.xml事物配置,包含A数据库和B数据库事务配置

<!--数据库A事务配置-->
<bean id="aDaTaTransactionManager"
	class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="aDataSource" />
</bean>
<bean id="aDataTransactionTemplate"
	class="org.springframework.transaction.support.TransactionTemplate">
	<property name="transactionManager" ref="aDaTaTransactionManager" />
</bean>
	

<!--数据库B事务配置-->
<bean id="bDaTaTransactionManager"
	class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="bDataSource" />
</bean>
<bean id="bDataTransactionTemplate"
	class="org.springframework.transaction.support.TransactionTemplate">
	<property name="transactionManager" ref="bDaTaTransactionManager" />
</bean>


@Transactional
public void addUser(User user){
    //...业务逻辑省略
	//此注解事务在业务逻辑发生异常时,数据库A对应的表数据不会回滚
}


@Transactional(value = "aDataTransactionManager", isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED, rollbackFor = {Exception.class,RuntimeException.class})
public void addUser(User user){
    //...业务逻辑省略
	//此注解事务在业务逻辑发生异常时,数据库A对应的表数据会回滚
}
</bean>


原因二:在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法。如下文章有详细说明。
参考转自:https://blog.csdn.net/clementad/article/details/47339519

解决的方法就简单了(两种):
把这两个方法分开到不同的类中;
把注解加到类名上面;



另外提一下编程事物的处理方式,场景依实际而来
@Service
public class TestBo{
	
	private static final Logger log = Logger.getLogger(TestBo.class);
	//步骤1
	@Resource(name="mysqlTransactionTemplate")
	//步骤2
	//@Resource(name="sqlserverTransactionTemplate")
	private TransactionTemplate transactionTemplate;
	
	/**
	 * 编程式事务
	 * 特殊复杂的业务,比如业务方法里操作两种不同类型数据库(如mysql和sqlserver),这种场景每种类型的业务处理尽可能简单,
	 * 如下代码步骤1和步骤2执行完之后,目标结果是两种类型数据库的数据都应该是执行前的结果。示例回滚的是步骤1的数据。
	 * 对应的TransactionTemplate应该注入mysqlTransactionTemplate,倘若注入sqlserverTransactionTemplate,步骤1的结果是不会回滚的,"业务谁先注入谁"
	 * 实际业务场景尽可能选择大概率不会出错的业务TransactionTemplate注入,可以保证后面的业务出错前面的基础数据回滚。
	 * 类似这种场景的可能有更多,更复杂的,这里只举个例子,没有特别完善的方法解决这类业务,欢迎大伙留言吐槽更好的解决办法
	 * @return
	 */
	private ResultMessage testTrans(final String param){
		return this.transactionTemplate.execute(new TransactionCallback<ResultMessage>() {
			@Override
			public ResultMessage doInTransaction(TransactionStatus status) {
				try {
					//1、......mysql业务处理成功
					//2、......sqlserver业务处理失败
				} catch (Exception e) {
					status.setRollbackOnly();
					log.error("--->> error.", e);
					return ResultMessage.error(e.getMessage());
				}
			}
		});
	}
	
}
分享到:
评论

相关推荐

    Java注解@Transactional事务类内调用不生效问题及解决办法

    Java注解@Transactional事务类内调用不生效问题及解决办法 Java注解@Transactional是Java中的一种注解,主要用于标记事务边界。然而,在某些情况下,@Transactional注解可能不会生效,例如在同一个类中的方法调用...

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

    4. **配置事务管理器** - 需要在Spring配置文件中声明`PlatformTransactionManager`,通常使用`HibernateTransactionManager`或`DataSourceTransactionManager`,取决于你是否使用ORM框架。 - 启用基于注解的事务...

    什么情况会导致@Transactional事务失效?

    1. **未启用事务管理**:如果你的应用没有配置Spring的事务管理器(如PlatformTransactionManager),或者没有开启AOP代理(例如,使用@Component而不是@Service等),`@Transactional`将无法生效。确保你的配置类...

    Spring @Transactional注解失效解决方案

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

    spring @Transactional 无效的解决方案

    当我们在方法 A 上添加 @Transactional 注解时,事务将正常生效,方法 A 和方法 B 将自动参与到同一个事务中。 结论 ---------- 在这篇文章中,我们介绍了 Spring @Transactional 注解无效的问题,并提供了解决...

    详细整理Spring事务失效的具体场景及解决方案.docx

    Spring事务失效的常见场景有七种,分别是:注解@Transactional 配置的方法非 public 权限修饰、注解@Transactional 所在类非 Spring 容器管理的 bean、注解@Transactional 所在类中,注解修饰的方法被类内部方法调用...

    Spring事务不生效.pdf

    在Spring框架中,事务管理是核心特性之一,用于确保数据库操作的原子性和一致性。然而,如果在实际开发中不注意一些细节,可能...在实际开发中,细心检查和配置事务管理,避免潜在的陷阱,是保证系统稳定性的关键步骤。

    Spring Data JPA系列4——Spring声明式事务处理与多数据源支持.doc

    @Transactional 注解有多种配置项,例如 isolation、propagation、rollbackFor 等,用于指定事务的处理方式。 四、多数据源支持机制 多数据源支持机制是用于支持多个数据源的机制。它可以确保每个数据源都可以独立...

    transaction.zip

    在Spring框架中,`@Transactional`注解是事务管理的核心元素,它允许开发人员在方法级别声明事务边界,从而简化了事务控制。...在实际开发中,根据项目需求合理配置事务属性,能够确保数据的一致性和应用的稳定性。

    springmvc事务配置到controller.zip

    "springmvc事务配置到controller.zip"这个压缩包很可能包含了关于如何在Spring MVC的Controller层配置事务管理的示例代码和相关教程。 首先,我们要理解Spring MVC中的事务管理主要依赖于Spring的事务抽象层,这...

    Spring Boot的事务控制.docx

    在Spring配置文件中配置事务管理器,例如: ```xml ``` 2. 在需要事务管理的方法或类上添加`@Transactional`注解,例如: ```java @Service public class BookService { @Autowired private ...

    java事务 - 使用注解

    声明式事务管理通过注解或XML配置实现,更易于维护,因此在实际开发中更为常见。`@Transactional`注解就是声明式事务管理的核心。 **3. @Transactional注解** - **位置**:`@Transactional`通常放在类级别或者方法...

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

    7. **事务属性**:`@Transactional`注解有多个属性,如`propagation`(事务传播行为)、`isolation`(隔离级别)、`readOnly`(只读事务)、`rollbackFor`和`noRollbackFor`(指定异常类型触发或不触发回滚)。...

    请教:spring事务不起作用

    这个问题可能是由多种原因引起的,包括但不限于配置错误、事务注解使用不当、事务传播行为理解有误等。下面我们将深入探讨这些可能的原因,并提供相应的解决策略。 首先,我们需要检查`SqlMapDao.java`和`...

    SpringBoot-Mybatis处理事务

    在SpringBoot框架中整合Mybatis进行事务管理是常见的开发实践,这主要涉及到Spring的声明式事务管理和Mybatis的事务配置。下面将详细讲解这个主题。 首先,SpringBoot简化了Spring的配置,使得开发者可以快速搭建...

    java-mybatis、springmvc 整合demo源码(druid-demo)

    然而,在实际开发中,我们可能会遇到事务不生效的情况。这通常是因为以下几个原因: 1. 检查事务管理器是否正确配置,例如,`PlatformTransactionManager`类型的bean。 2. 确保@Transactional注解的使用位置正确,...

    事务的使用方法

    ### 事务的使用方法 #### 一、引言 在软件开发中,特别是在...无论是通过编程式还是声明式事务管理,开发者都需要根据具体的应用场景选择合适的方法来配置事务。希望本文能够帮助开发者更好地理解和应用事务技术。

    spring3 struts2 Mybatis3 组件注解 事务注解 实例

    Spring的`&lt;tx:annotation-driven&gt;`标签启用注解驱动的事务管理,使`@Transactional`生效。Struts2的配置文件需要指定Action类及其结果映射,而Mybatis3的配置则包括数据源、SqlSessionFactory和Mapper扫描。 在业务...

    spring事务总结.docx

    #### 一、事务不生效的原因及解决办法 1. **访问权限问题** - **背景**:在Java中,方法的访问权限有`private`、`default`(包私有)、`protected`和`public`。Spring事务管理器在识别方法级别的事务时,会检查...

Global site tag (gtag.js) - Google Analytics