`
zzc1684
  • 浏览: 1225941 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

被忽略的Spring3小改进——支持多数据源的@Transactional事务注解

阅读更多

[问题]


近日,有同事问起,有个项目在配置Spring事务时,使用了@Transactional注解,但这个项目使用了多个数据源,而事务注解只对第一个起作用,咋办?

 

[探幽]

一听之下,想起在用@Transactional配置事务时,确实没注意过多数据源问题,但是记得之前常用的XML配置方式中,对多数据源支持很简单,我想注解配置起来应该也不会太麻烦。

 

先回顾一下之前个人习惯使用的 <tx:advice> + <aop:config>配置方式,大致步骤如下:
1)定义与事务管理器对应的事务通知
2)配置需要拦截的方法调用切面
3)将切入点连接到相应的事务通知
整个系统的事务,三下配置,一处搞定,相比注解方式,个人觉得更简单、省力、统一;而要支持多数据源,再做一遍这123即可,非常简单。

 

不过同事在网上百度了一圈,说大部分的结论是Spring的@Transactional注解不支持,听到这一点我很诧异,不应该啊,要不查查Spring的官方文档?

一查马上发现,在Spring3.0的参考文档中,针对这个问题的,真新增了一节(10.5.6.2)来解决,参见:
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#transaction-declarative-annotations

Most Spring applications only need a single transaction manager, but there may be situations where you want multiple independent transaction managers in a single application. The value attribute of the
@Transactional annotation can be used to optionally specify the identity of the
PlatformTransactionManager to be used. This can either be the bean name or the qualifier value
of the transaction manager bean

 

也就是说,在Spring2.5之前,@Transactional注解确实不支持多数据源,但是Spring3为其增加了value属性配置,可以指定当前事务通知对应的事务管理器。

 

检查了一下Spring的changelogs,这个特性是在3.0M4版中加入的:
@Transactional supports qualifier value for choosing between multiple transaction managers

[解难]


看来,或许这是一个有用的小改进,但很可能被大家忽略了。下面是从官方文档中摘抄出来的示例配置方式,供需要的同学参考:

1、配置事务注解驱动、每个数据源对应的事务管理器,并定义“限定符”

<tx:annotation-driven/>  
  
<bean id="transactionManager1" class="org.springframework.jdbc.DataSourceTransactionManager">  
...   
<qualifier value="order"/>  
</bean>  
<bean id="transactionManager2" class="org.springframework.jdbc.DataSourceTransactionManager">  
...   
<qualifier value="account"/>  
</bean>   

 

 

2、在需要事务的地方,指定“限定符”

public class TransactionalService {   
  
@Transactional("order")   
public void setSomething(String name) { ... }   
  
@Transactional("account")   
public void doSomething() { ... }   
}  

 

 

3、如果不指定“限定符”,将默认使用“transationManager”命名对应的事务管理器

The default <tx:annotation-driven> target bean name transactionManager will still be used if no specifically qualified PlatformTransactionManager bean is found  

 

呼呼,小改进,大作用啊。

分享到:
评论

相关推荐

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

    Spring3引入了基于注解的事务管理,极大地简化了事务配置,使得开发者可以在方法级别声明事务边界,这就是`@Transactional`注解的用处。本文将深入探讨这个注解以及如何在Spring3中有效地使用它。 `@Transactional`...

    后端 Java Spring Data Jpa @Transactional 介绍

    在Java后端开发中,Spring框架提供了强大的事务管理能力,特别是在使用Spring Data JPA时,`@Transactional`注解使得事务处理变得简单易用。这个注解是Spring框架中的核心部分,它允许开发者声明性地控制事务边界,...

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

    Spring 声明式事务处理与多数据源支持 在大部分涉及到数据库操作的项目里面,事务控制、事务处理都是一个无法回避的问题。Spring 框架提供了声明式事务处理机制,使得业务代码中进行事务控制操作起来非常简单。只需...

    Spring中@Transactional事务回滚(含实例

    在Spring框架中,`@Transactional`注解是用于标记事务管理的重要工具,它使得开发者能够方便地在代码中声明式地控制事务的边界。本文将深入解析`@Transactional`的事务回滚机制,并通过实例来详细讲解其工作原理,...

    spring 自定义事务管理器,编程式事务,声明式事务@Transactional使用

    通过配置Spring的数据源和事务管理器,可以轻松地连接到H2并进行事务管理。 **自定义事务管理器** 当标准的`PlatformTransactionManager`无法满足需求时,可以创建自定义的事务管理器。这可能涉及到对特定数据库...

    spring的annotation-driven配置事务管理器详解 (多数据源配置

    Spring 的 Annotation-Driven 配置事务管理器详解...Spring 的 Annotation-Driven 配置事务管理器提供了强大的事务管理机制,可以方便地管理多个数据源的事务,并且可以通过 `@Transactional` 注解来指定事务管理器。

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

    在Java编程中,`@Transactional`注解是Spring框架提供的一种事务管理机制,它使得开发者能够在方法级别方便地声明事务边界。然而,在某些特定情况下,`@Transactional`可能会失效,导致事务无法正常工作。以下是一些...

    spring的@Transactional注解详细用法1

    在Spring框架中,事务管理是实现企业级应用稳定性和数据一致性的重要组成部分。Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。本文将重点介绍基于`@Transactional`注解的声明式事务管理。 ...

    Spring @Transactional注解失效解决方案

    3. 只读事务:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true) 只读标志只在事务启动时应用,否则即使配置也会被忽略。 二、事务传播模式 在 @Transactional 注解中,Propagation 枚举了...

    Spring声明式事务@Transactional知识点分享

    在 Spring 框架中,@Transactional 注解是实现声明式事务的关键。通过 @Transactional 注解,可以指定事务的传播行为、隔离级别、读写控制等属性。 首先,@Transactional 注解支持 9 个属性的设置,常用的三个属性...

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

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

    springboot多数据源即分布式事务解决方案,添加对多线程的支持

    本教程将深入探讨如何在Spring Boot环境下实现多数据源操作及分布式事务管理,并加入对多线程的支持。 首先,我们来理解多数据源的概念。在大型系统中,往往需要连接多个数据库,如主库、从库、测试库等。Spring ...

    Spring @Transactional工作原理详解

    在Spring框架中,`@Transactional`注解是一个强大的工具,用于声明式地管理事务。它使得开发者无需显式地在代码中控制事务的开始、提交和回滚,从而提高了代码的可读性和可维护性。下面我们将深入探讨`@...

    浅谈Spring中@Transactional事务回滚及示例(附源码)

    浅谈Spring中@Transactional事务回滚及示例 @Transactional是Spring Framework中的一种事务管理机制,用于管理数据库事务。它可以使得数据库操作更加安全和可靠。本文将详细介绍@Transactional的使用场景、checked...

    springboot中事务管理@Transactional的注意事项与使用场景

    3. 数据库引擎支持:数据库引擎要支持事务,使用 InnoDB。 4. 锁的作用范围:当方法加上 synchronized 时,由于锁的作用范围比事务的作用范围小,因此应该修改锁的作用范围,保证锁的范围比事务的范围大。 使用 @...

    spring boot注解事务+多线程

    综上所述,Spring Boot通过`@Transactional`注解实现了简单而强大的事务管理,保证了数据一致性;而`@Async`注解则让我们轻松地实现多线程,提升了应用的并发性能。结合适当的线程池配置,我们可以灵活地调整系统...

    Spring中的@Transactional事物回滚实例源码

    在Spring框架中,`@Transactional`注解是事务管理的核心组件,它允许开发者在方法级别声明事务边界。本文将深入探讨这个注解的工作原理、如何配置以及如何在遇到异常时触发事务回滚。 首先,`@Transactional`是...

    基于注解和Spring的多数据源配置和使用

    5. **配置事务管理器**:对于多数据源,我们需要配置多个事务管理器,并通过`@Transactional`注解指定使用哪个事务管理器。例如: ```java @Configuration @EnableTransactionManagement public class ...

    spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制

    在现代企业级应用开发中,多数据源切换和分布式事务管理是常见的需求,尤其是在大型分布式系统中。Spring框架因其强大的依赖注入和AOP(面向切面编程)特性,成为Java领域首选的轻量级框架。Druid是一个优秀的数据库...

Global site tag (gtag.js) - Google Analytics