Spring事务管理

ubuntu20.04搭建QGC4.2编译环境 QGC 4.2ubuntu18.04也可以编译QGC4.2,但是由于GLBC版本较低,无法使用最新版的QTCreator,Ubuntu20.04可以使用最新版QTCreator。 阅读详情

     学了一周的Spring事务管理,特整理出来,以便以后翻阅。

   概念:事务是一组原子性操作的工作单元,这组工作单元要么执行成功,要么不成功 

事务四大特征:原子性,一致性,隔离性和持久性。

    1. 原子性  一个原子事务要么完整执行,要么干脆不执行。 这意味着,工作单元中的每项任务都必须正确执行。如果有任一任务执行失败,则整个工作单元或事务就会被终止。即此前对数据所作的任何修改都将被撤销。如果所有任务都被成功执行,事务就会被提交,即对数据所作的修改将会是永久性的。

    2. 一致性 一致性代表了底层数据存储的完整性。 它必须由事务系统和应用开发人员共同来保证。事务系统通过保证事务的原子性,隔离性和持久性来满足这一要求; 应用开发人员则需要保证数据库有适当的约束(主键,引用完整性等),并且工作单元中所实现的业务逻辑不会导致数据的不一致(即,数据预期所表达的现实业务情况不相一致)。例如,在一次转账过程中,从某一账户中扣除的金额必须与另一账户中存入的金额相等。

    3. 隔离性  隔离性意味着事务必须在不干扰其他进程或事务的前提下独立执行。 换言之,在事务或工作单元执行完毕之前,其所访问的数据不能受系统其他部分的影响。

    4. 持久性  持久性表示在某个事务的执行过程中,对数据所作的所有改动都必须在事务成功结束前保存至某种物理存储设备。 这样可以保证,所作的修改在任何系统瘫痪时不至于丢失。

      事务分编程式事务和声明式事务

spring出来之前一般都是编程式事务,如果要用声明式事务,必须符合j2ee的规范,比如weblogic。有了spring,我们可以很优雅的用声明式事务。

编程式事务:手动处理事务                                 缺点:每一个业务方法都包含类似启动、 提交、回滚事务的样板代码

ž声明式事务:配置文件中声明式的处理事务       优点:侵入性低,通用性强

 

žSpring同时提供了Annotation和XML配置方式的声明式事务管理

Annotation可以节省很多配置,但是当需要配置一些共有的配置的时候,像spring 声明式事务 xml会更好

选择以哪种方式声明事务可以参考以下几点建议:

  • 如果service层的方法绝大部分都是数据库操作,我们可以使用XML风格在service层声明事务边界。
  • 如果service层的方法除了数据库操作外,还有很多耗时的业务方法(例如XML风格一节的例子),那么就可以采用Annotation风格。
  • 也可以将XML风格和Annotation风格结合起来一起使用。这是我推荐使用的,只使用两种风格的优点,而避免了它们的缺点。

个人感悟:关于选择annotation或者xml,应根据具体情况而定,但目前注解的方式越来越流行,而且我相信注解会越来越完善,虽然不能完全取代xml,但注解占95以上,xml占不到5%,因为注解真的很方便,少了很多配置,只需要@transaction就可以搞定

 

ž<!-- JBoss JTA transactionmanager -->
ž       <!-- START -->
ž       <beanid="jbossTransactionManager"
ž        class="com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple">
ž       </bean>
ž
ž       <beanid="jbossUserTransaction"
ž              class="com.arjuna.ats.internal.jta.transaction.arjunacore.UserTransactionImple"/>
ž
ž       <beanid="transactionManager"
ž             class="org.springframework.transaction.jta.JtaTransactionManager">
ž              <propertyname="transactionManager">
ž                     <refbean="jbossTransactionManager" />
ž              </property>
ž              <propertyname="userTransaction">
ž                     <refbean="jbossUserTransaction" />
ž              </property>
ž       </bean>
ž<tx:annotation-driventransaction-manager=“transactionManager”>
 
ž<session-factory>中需定义packagesToScan ,annotatedPackages(早期)
ž<property name="packagesToScan ">
ž<list>  <value>com.service</value></list> </property

 

ž上面用到jboss的jta事务管理

jta和jdbc的事务管理区别:(网上其他人的总结,比较清晰)

JDBC事务由Connnection管理,也就是说,事务管理实际上是在JDBCConnection中实现。事务周期限于Connection的生命周期之类。同样,对于基于JDBC Transaction的 Hibernate 事务管理机制而言,事务管理在 Session 所依托的 JDBC Connection中实现,事务周期限于Session的生命周期。

JTA 事务管理则由 JTA 容器实现,JTA 容器对当前加入事务的众多 Connection 进行调度,实现其事务性要求。JTA的事务周期可横跨多个JDBC Connection生命周期。同样对于基于JTA事务的Hibernate而言,JTA事务横跨可横跨多个Session。

 

我的理解:jdbc的事务由jdbc connection实现,也就是在一个connection中,事务局限于connection的声明周期,而jta事务由jta容器实现,容器来管理connection,这样就可以跨越多个jdbc事务,所以 强烈建议用jta的事务管理。

 

以上配置就可以使用在com.service包下用@Transactional标记类或者方法了。

 

可以使用@Transactional标记一个接口,接口中的方法,一个类的定义或者类中的公共方法。但是仅仅提供@Transactional标记是不够的,@Transactional标记只是一种能够被某种运行时架构使用的配置元数据,因此需要提供能够自动识别@Transactional标记的架构支持。上例中,使用<tx:annotation-driven/>元素开启了标记的事务行为。

 

Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解,

你可以通过 <tx:annotation-driven/> 元素的"proxy-target-class" 属性值来控制是基于接口的还是基于类的代理被创建。如果 "proxy-target-class" 属值被设置为"true",那么基于类的代理将起作用(这时需要CGLIB库cglib.jar在CLASSPATH中)。如果 "proxy-target-class" 属值被设置为"false"或者这个属性被省略,那么标准的JDK基于接口的代理将起作用。 

@Transaction的属性

ž@Transactional(noRollbackFor=RuntimeException.class)    不回滚的异常类
@Transactional(RollbackFor=Exception.class)                          回滚的异常类,默认回滚RunTimeExcetion,如果要所有异常都回滚,必须加上RollbackFor=Exception.class
@Transactional(readOnly=true)                                                    是否只读,若设为true,那么这个事务对数据库只能读,而不能增,删,改,默认为false
@Transactional(timeout=100)                          超时(单位 秒)
@Transactional(isolation=Isolation.DEFAULT)            隔离级别

@Transactional(propagation=Propagation.REQUIRED)          传播机制

 

下面主要讲隔离级别和传播机制

 

隔离级别  先理解三个概念  脏读,不可重复读,幻读(幻想读)

 

脏读dirty reads:当事务读取还未被提交的数据时,就会发生这种事件。举例来说:Transaction1 修改了一行数据,然后 Transaction 2 在 Transaction 1 还未提交修改操作之前读取了被修改的行。如果 Transaction 1 回滚了修改操作,那么 Transaction2 读取的数据就可以看作是从未存在过的。
不可重复的读non-repeatable reads:当事务两次读取同一行数据,但每次得到的数据都不一样时,就会发生这种事件。举例来说:Transaction 1 读取一行数据,然后Transaction2 修改或删除该行并提交修改操作。当 Transaction 1 试图重新读取该行时,它就会得到不同的数据值(如果该行被更新)或发现该行不再存在(如果该行被删除)。
虚读phantom read:如果符合搜索条件的一行数据在后面的读取操作中出现,但该行数据却不属于最初的数据,就会发生这种事件。举例来说:Transaction 1 读取满足某种搜索条件的一些行,然后 Transaction2 插入了符合 Transaction 1 的搜索条件的一个新行。如果 Transaction 1 重新执行产生原来那些行的查询,就会得到不同的行。

 

1  @Transaction(ISOLATION.DEFAULT )默认的隔离级别
与底层数据库的隔离级别一致,假如使用oracle,那么就可以防止脏读,不可重复读,可能出现幻读
2 ISOLATION.READ_UNCOMMITTED
脏读,不可重复读和虚读有可能发生。
3 ISOLATION.READ_COMMITTED
指示可以发生脏读 (dirtyread),但可能发生不可重复读和虚读 (phantomread)。
4 ISOLATION.REPEATABLE_READ
指示防止发生脏读和不可重复读的常量;虚读有可能发生。
5 ISOLATION.SERIALIZABLE
指示防止发生脏读、不可重复读和虚读的常量。

  传播机制

REQUIRED:业务方法需要在一个容器里运行。如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务。 
NOT_SUPPORTED:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为他开启事务,如果方法在一个事务中被调用,该事务会被挂起,调用结束后,原先的事务会恢复执行。 
REQUIRES_NEW:不管是否存在事务,该方法总汇为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务挂起,新的事务被创建,直到方法执行结束,新事务才算结束,原先事务才会恢复执行

MANDATORY:该方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果在没有事务的环境下被调用,容器抛出例外。 
SUPPORTS:该方法在某个事务范围内被调用,则方法成为该事务的一部分。如果方法在该事务范围外被调用,该方法就在没有事务的环境下执行。 
NEVER:该业务方法绝对不能在事务范围内执行。如果在就抛例外。只有该方法没有关联到任何事务,才正常执行。 

上面的事略在ejb中都会存在。只有下面的事务才是spring自己提供的:

NEST:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务 拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。

  

 

innovus中如何设置cts参数 上面是设置cts的一般设置,如果需要对某些skew group或者某些clock tree设置不一样的参数,如需要对clk1这个clock设置不一样的inverter,可以使用。需要查询已经设置过的ccopt参数,可以使用get_ccopt_property去查询,方法和set_ccopt_property一致。言归正传,cts的设置命令是set_ccopt_property,获取命令是get_ccopt_property。另外,set_ccopt_property提供一套命令查询方法。 阅读详情

相关推荐

Mac上VMware Fusion手动安装VMware Tools实现跨系统复制粘贴

本文详细指导了在Mac的VMware Fusion中手动安装VMware Tools的完整流程,以解决虚拟机与宿主机之间无法复制粘贴的常见问题。通过定位安装镜像、挂载、解压并运行安装脚本,最终实现跨系统无缝数据交换,提升工作效率。

orange的博客 698

【Spring】Spring的事务管理

该接口是Spring提供平台事务管理器,主要用于管理事务状态事务TransactionStatus getTransaction(TransactionDefinition definition):获取事务的状态信息void commit(TransactionStatus status):用于提交事务void rollback(TransactionStatus status):用于回滚事务该接口并不了解具体实现类,常用如下。

m0_62645012的博客 2068

win11怎么安装dosbox和masm来运行汇编程序(小白,萌新篇)

一文教会你如何部署dosbox和masm环境

m0_73279193的博客 4700

【Spring】— Spring的事务管理

Spring的事务管理简化了传统的事务管理流程,并且在一定程度上减少了开发者的工作量。

衍生星球的博客 3320

智能座舱架构与芯片 - (3) 硬件篇 上

在了解智能座舱的基本架构之后,我们有必要针对智能座舱域的硬件平台,软件平台,SOC等进行逐一介绍。从它们的整体结构中去认识最新的智能座舱组成部件,以及主要功能等。如上图,是中央计算-区域控制架构下的智能座舱硬件平台框架图,其中,智能座舱控制器CDC挂载在以太网交换机上,与其他车控域VDC,自驾域ADC,网联设备5G+V2X等通过以太网实现数据交互。而智能座舱域的外部硬件设备还包含有连接子系统音频子系统摄像头子系统显示子系统存储子系统功能安全子系统等。

joanna_xiao的博客 2400

用Multisim复刻经典收音机:从零搭建超外差中波调幅接收机(附仿真源文件)

本文详细介绍了如何使用Multisim软件从零搭建超外差中波调幅接收机,复刻经典收音机的设计过程。通过模块化搭建、稳定性优化和增益分配等实战指南,帮助读者掌握超外差架构的核心技术,并附赠仿真源文件供实践参考。

weixin_28744423的博客 473

Spring事务管理总结

Spring事务管理机制概述 Spring事务管理模块主要包括3个接口 PlatformTransactionManager:事务管理器,主要用于平台相关的事务管理。 TransactionDefinition:事务定义信息(隔离级别、传播、超时、只读)通过配置如何进行事务管理。 TransactionStatus:事务具体运行状态——事务管理过程中,每个时间点事务的状态信息。 1、Platf...

qq_42961888的博客 695

2025.05.29【Network】多组学分析:网络互作图绘制

本文介绍了使用R语言进行网络图绘制的方法与技巧。重点讲解了三个核心R包的使用:igraph用于网络图数据准备与基础绘制,ggraph基于图形语法实现高级可视化,networkD3则为网络图添加交互功能。文章涵盖了从基本概念、包安装、创建网络图对象,到自定义样式布局、添加交互性等完整流程,并提供了度分布、聚类系数等网络分析指标的计算方法。通过清晰的代码示例,帮助读者掌握生物信息学数据可视化的关键技能,为复杂数据的直观展示和分析提供实用工具。

227

Spring:Spring事务管理知识讲解

Spring为了管理事务,提供了一个平台事务管理器commit是用来提交事务,rollback是用来回滚事务。PlatformTransactionManager只是一个接口,Spring还为其提供了一个具体的实现:从名称上可以看出,我们只需要给它一个DataSource对象,它就可以帮你去在业务层管理事务。其内部采用的是JDBC的事务。所以说如果你持久层采用的是JDBC相关的技术,就可以采用这个事务管理器来管理你的事务。

qq_41187116的博客 1407

uniapp - 微信支付报错 requestPayment:fail:HBuilder mainifest.json中配置的支付appid和生成订单使用的appid不一致,如果是HB调试请在线打包

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,微信支付,报错,errMsg,requestPayment:fail:HBuildermainifest.json中配置的支付appid和生成订单使用的appid不一致,如果是HB调试请在线打包,http://ask.dcloud.net.cn/article/282,已经都检查了还是报错,如何解决这个问题,还是不行,错误,苹果微信支付报错,安卓app微信支付出错,打包,在线打包也不行,本地打包,支

🏆 前端领域优质创作者 3500

QGC4.0.11界面修改

QGC4.0.11。

超维空间科技的博客 2466

Spring 事务管理机制概述

用户的每次请求都对应一个业务逻辑方法,而一个业务逻辑方法往往包括一系列数据库原子访问操作,并且这些操作应绑定成一个事务来执行。使用传统事务编程策略时,程序代码必然和具体的事务操作代码耦合,而Spring事务管理策略可以避免这种尴尬。Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理,本文在对Spring事务管理API分析的基础上,详细地阐述了Spring编程式事务管理和声明式事务管理的原理、本质和使用

Rico's Blogs 3万+

内部函数方式获取工序包容盒(最低点和最高点)PTHDSP_ask_box

内部函数方式获取工序包容盒(最低点和最高点)PTHDSP_ask_box。

成长需要沉淀。 397

Spring事务管理详解

Spring事务管理详解

一个普本码农奋斗史 8万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Spring中进行事务管理的两种方式

1、Spring中事务管理的API PlatformTransactionManager TransactionDefinition TransactionStatus 2、编程式事务管理 3、声明式事务管理 基于Spring-AOP的方式 基于AspectJ的标签 基于注解的方式

theVicTory的博客 4122

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【Spring】Spring事务管理

1.1简介Spring框架内部使用事务管理器的接口,来完成commit和rollback针对不同的框架,提供不同的实现类1.2ACID属性。

wosixiaokeai的博客 1145

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

说说Spring事务管理

实现了业务逻辑与事务控制的解耦。Spring 事务管理是 Spring 框架的核心功能之一,旨在简化数据库操作的原子性、一致性、隔离性和持久性(ACID)控制。原理:基于 AOP 动态代理,在运行时拦截@Transactional注解的方法,自动管理事务的开启、提交和回滚。嵌套事务回滚:REQUIRES_NEW的内层事务回滚不影响外层,而NESTED的内层回滚可被外层捕获。避免大事务:减少事务内耗时操作(如 RPC 调用),拆分为小事务。适用场景:需精细控制事务边界(如根据条件提交/回滚)。

tschen的博客 1270

Spring的事务管理

Spring的事务管理 事务 事务:是逻辑上一组操作, 要么全都成功, 要么全都失败. 事务特性: ACID: 原子性:事务不可分割 一致性:事务执行的前后, 数据完整性保持一致. 隔离性:一个事务执行的时候, 不应该受到其他事务的打扰 持久性:一旦结束, 数据就永久的保存到数据库. 如果不考虑隔离性: 脏读:一个事务读到另一个事务未提交数据 不可重复读:一个事务读到另一个事务已经提交数据( update) 导致一个事务多次查询结果不一致 虚读:一个事务读到另一个事务已经提交数据( ins

qq_41796988的博客 2013

【Spring Framework】 Spring 事务管理

Spring 事务管理提供了一种灵活、强大的方式来管理应用程序中的事务。通过使用 Spring 事务,开发者可以轻松地实现数据的一致性和完整性。无论是编程式事务管理还是声明式事务管理,Spring 都能很好地支持各种场景的事务需求。在实际项目中,开发者应根据业务需求合理选择事务传播行为、隔离级别和事务管理器,以实现高效的事务管理。

u013675821的博客 689

Spring的事务管理机制

Spring事务管理机制概述 Spring事务管理模块主要包括3个接口 PlatformTransactionManager:事务管理器,主要用于平台相关的事务管理。 TransactionDefinition:事务定义信息(隔离级别、传播、超时、只读)通过配置如何进行事务管理。 TransactionStatus:事务具体运行状态——事务管理过程中,每个时间点事务的状态信息。 1、Platf...

qq_42961888的博客 2332

Spring 事务管理

(个人学习记录)本章主要记录spring事务的两种实现方式,及编程式事务和声明式事务(xml和注解方式),在实际过程中,我们绝大多数时候都是使用的声明式事务来实现我们的事务管理。对于事务的隔离级别和传播行为我们需要重点了解。事务是一个最小的不可再分的工作单元。 一个事务对应一套完整的业务操作。事务管理是指这些操作要么全部成功执行,要么全部回滚,从而保证数据的一致性和完整性。事务是一组原子性的操作,要么全部成功提交,要么全部失败回滚。它具有 ACID 四个特性:原子性(Atomicity):事务中的操作要么全

LYH2771994122的博客 921

spring事务管理

spring事务管理什么是事务:事务的特性:Spring支持两种方式事务管理编程式的事务管理:声明式的事务管理: 更多文章欢迎访问个人博客 www.herobin.top 什么是事务: 事务指的是逻辑上的一组操作,这组操作要么全部成功,要么全部失败.(银行转账) 事务的特性: 原子性 一致性 隔离性 持久性 原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生 ...

qq_24095055的博客 6569

理解Spring中的事务管理

Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,Spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获取连接 Connection con = DriverManager.getConnection() 开启事务con.setAutoCommit(true/false); 执行CRUD 提交事务/回...

Hopefully Sky的博客 3904
上一篇: 设计模式之观察者模式(二)
下一篇: Publish failed using Ant publisher Resource is out of sync
beyond667
博客等级 码龄15年 41粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值