`

基于@Transactional的事务管理

 
阅读更多

spring提供俩种事务管理方式

1.annotation(注解)

2.xml配置(aop技术)

 

本文介绍下第一种,annotation注解的方式

一、首先,在spring的配置文件中,配置如下配置:



 

在配置文件中,配置事务管理对象,比如org.springframework.orm.hibernate4.HibernateTransactionManager,或者org.springframework.orm.jpa.JpaTransactionManager,或者org.springframework.jdbc.datasource.DataSourceTransactionManager等等(当然,这三种事务管理对象的使用场景和功能不是完全一致的)。

然后加入<tx:annotation-driven/>节点,引用该事务管理对象,之后即可在需要进行事务处理的方法使用@Transactional进行标注。

之于事务对象的属性配置,<property>,可以配置SessionFactory,可以配置dataSource等,截图中配置了SessionFactory。

 针对<tx:annotation-driven/>的说明:

配置文件中我们经常看到 annotation-driven 这样的注解,其含义就是支持注解,一般根据前缀 tx、mvc 等也能很直白的理解出来分别的作用。<tx:annotation-driven/> 就是支持事务注解的(@Transactional) 、<mvc:annotation-driven> 就是支持mvc注解的,说白了就是使Controller中可以使用MVC的各种注解。

首先,<tx:annotation-driven/>  会有一个属性来指定使用哪个事务管理器,如:<tx:annotation-driven transaction-manager="transactionManager" />。然后事务管理器 transactionManager 会引用 dataSource (如果我们使用JPA或Hibernate,也需要指定一个 entityManagerFactory ),dataSouce 肯定就是直接对数据库的了。

二、配置完成之后,在使用事务管理的类或者方法上使用@Transactional进行注解即可,一般需要更新数据库,保存数据库等操作的类或者方法需要进行事务注解。

如下图所示:



 三、对于注解,可以设置事务属性,比如:

@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class)

根据定义,Transactional注解可以有如下的属性定义:



 Propagation。主要用来配置当前需要执行的方法,与当前是否有transaction之间的关系。

  • Propagation.MANDATORY 。当前方法必须在已经定义的Transaction中运行,如果没有已定义的Transaction则抛出异常。
  • Propagation.NESTED 。如果没有已定义的Transaction,当前方法新开一个Transaction并在该Transaction中运行。如果存在已定义的 Transaction,当前方法在嵌套事务(Nested Transaction)中运行 — 嵌套事务中可以定义储存点,因此可以独立于外部的Transaction而进行rollback。
  • Propagation.NEVER 。当前方法不应在Transaction中运行,如果存在已经定义的Transaction则抛出异常。
  • Propagation.NOT_SUPPORTED 。当前方法不应在Transaction中运行,如果存在已经定义的Transaction,则该Transaction暂停(挂起)直至该方法运行完毕。
  • Propagation.REQUIRED默认值 。当前方法必须在Transaction中运行。如果存在已经定义的Transaction,则该方法在已定义的Transaction中运行;如果不存在已经定义的Transaction,则该方法新开一个Transaction并在其中运行。
  • Propagation.REQUIRES_NEW 。当前方法必须在新开的Transaction中运行。如果存在已经定义的Transaction,则该已定义的Transaction暂停直至新开的Transaction执行完毕。
  • Propagation.SUPPORTS 。当前方法不需要在Transaction中运行,但如果存在已经定义的Transaction,则该方法也可以在Transaction中正常执行。


  •   

三、@Transactional标注的位置

@Transactional注解可以标注在类和方法上,也可以标注在定义的接口和接口方法上。
如果我们在接口上标注@Transactional注解,会留下这样的隐患:因为注解不能被继承,所以业务接口中标注的@Transactional注解不会被业务实现类继承,可能会出现不启动事务的情况。所以,Spring建议我们将@Transaction注解在实现类上。
在方法上的@Transactional注解会覆盖掉类上的@Transactional。
 
 
  • 大小: 97.5 KB
  • 大小: 191 KB
  • 大小: 438 KB
  • 大小: 30.2 KB
分享到:
评论

相关推荐

    spring的@Transactional注解详细用法1

    声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,

    基于框架的Web开发-基于注解的事务配置.doc

    在applicationContext-tx.xml文件上加上tx:annotation-driven元素,保留事务管理器的bean声明。tx:advice和aop config的配置全部注释掉。 其余和切面、通知有关的配置都注释掉,或者删掉这个属性值引用前面定义的...

    注解实现声明式事务管理

    注解实现声明式事务管理

    基于java的企业级应用开发:声明式事务管理.ppt

    使用@Transactional注解时,可以通过参数配置事务详情: 5.2.2 基于Annotation方式的声明式事务 * * * * * * * * 声明式事务管理 如何实现Spring的声明式事务管理? 5.2 声明式事务管理 Spring的声明式事务管理可以...

    Spring+Hibernate事务管理

    Spring将事务管理分成了两类: * 编程式事务管理 * 手动编写代码进行事务管理.(很少使用) * 声明式事务管理: * 基于TransactionProxyFactoryBean的方式.(很少使用) * 需要为每个进行事务管理的类,配置一个...

    深入理解Spring声明式事务:源码分析与应用实践

    Spring框架的声明式事务管理是Java开发中的核心特性,它为高效且可靠的数据操作提供了强大支持。Spring通过@Transactional注解以及底层的AOP和代理机制实现了声明式事务。这个机制允许开发者通过简单的注解就能控制...

    spring注解事务实现demo

    声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,更清爽。spring注解事务实现demo

    积分管理系统java源码-blog:blog一个基于SpringBoot技术栈的个人博客---&gt;服务端

    积分管理系统java源码 blog 一个基于SpringBoot技术栈的个人博客(服务端)...我们知道@Serveice注解用来发布服务的,而@Transactional是控制事务管理的,涉及到数据库的增删改就要有事务的管理,所以这两个注解在服务层是少

    transDemo.zip

    spring声明式事务管理方式( 基于tx和aop名字空间的xml配置+@Transactional注解),源码包,包含数据库表文件

    spring-transaction

    Spring将事务管理分成了两类 编程式事务管理 手动编写代码进行事务管理.(很少使用) 声明式事务管理 基于TransactionProxyFactoryBean的方式.(很少使用) 需要为每个进行事务管理的类,配置一个...

    Spring中文帮助文档

    9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. IBM WebSphere 9.8.2. BEA WebLogic 9.8.3. Oracle OC4J 9.9. 常见问题的解决方法 9.9.1. 对一个特定的 DataSource 使用了错误...

    spring chm文档

    9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. BEA WebLogic 9.8.2. IBM WebSphere 9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多...

    Spring API

    9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. IBM WebSphere 9.8.2. BEA WebLogic 9.8.3. Oracle OC4J 9.9. 常见问题的解决方法 9.9.1. 对一个特定的 DataSource 使用了错误...

    OA项目SSH整合框架

    -- 配置事务管理器 --&gt; &lt;property name="sessionFactory" ref="sessionFactory"&gt;&lt;/property&gt; &lt;!-- 配置基于注解的事务支持--&gt; 2,测试代码 1,Service类 @Service public class ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. BEA WebLogic 9.8.2. IBM WebSphere 9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的...

    Spring 2.0 开发参考手册

    9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. BEA WebLogic 9.8.2. IBM WebSphere 9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多...

    Spring.3.x企业应用开发实战(完整版).part2

    10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼 10.6.1 哪些方法不能实施Spring AOP事务 10.6.2 事务增强遗漏实例 10.7 数据连接泄漏 10.7.1 底层连接资源的访问问题 10.7.2 Spring JDBC...

    Spring3.x企业应用开发实战(完整版) part1

    10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼 10.6.1 哪些方法不能实施Spring AOP事务 10.6.2 事务增强遗漏实例 10.7 数据连接泄漏 10.7.1 底层连接资源的访问问题 10.7.2 Spring JDBC...

    Lisp的STM库STMX.zip

    事务内存目前有两种实现方式,基于软件的STM(Software Transactional Memory)和基于硬件的HTM(Hardware Transacational Memory)。 采用任务并行时必须考虑线程间同步的问题:最初步也是最通常的方法是使用锁,...

    transactionalmachinelearning:使用数据流和AutoML的事务性机器学习

    TML基于以下信念:“快速数据需要快速的机器学习才能快速做出决策” 。 TML产生在产业发展到的数据流对科学家数据科学家在常规机器学习(CML)。 即将到来的TML书详细找到 将自动机器学习应用于数据流并创建事务性...

Global site tag (gtag.js) - Google Analytics