Spring事务属性

433MHz无线通信 基本概念 工作频率:433.92MHz 调制方式:ASK/OOK,FSK,GFSK 现有遥控与接收器方案中,多数使用ASK/OOK调试方式。ASK即“幅移键控”又称为“振幅键控”,也有称为“开关键控”(通断键控)的,所以又记作OOK(On-Off keyed)信号。ASK是一种相对简单的调制方式。幅移键控(ASK)相当于模拟信号中的调幅,不同的是与载频信号相乘的是二进制数码。幅移就是把频... 阅读详情

Spring,是一个Java开源框架,是为了解决企业应用程序开发复杂性由Rod Johnson创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。


Spring声明式事务让我们从复杂的事务处理中得到解脱,使得我们再也不必去处理获得连接、关闭连接、事务提交和回滚等这些操作,再也无需我们在与事务相关的方法中处理大量的try…catch…finally代码。 
我们在使用Spring声明式事务时,有一个非常重要的概念就是事务属性。事务属性通常由事务的传播行为、事务的隔离级别、事务的超时值、事务只读标志组成。我们在进行事务划分时,需要进行事务定义,也就是配置事务的属性。 

Spring在TransactionDefinition接口中定义这些属性,以供PlatfromTransactionManager(github)使用,PlatfromTransactionManager是spring事务管理的核心接口。


TransactionDefinition.java(spring-tx/src/main/java/org/springframework/transaction/TransactionDefinition.java,github)

[java]  view plain copy print ?
  1. public interface TransactionDefinition {  
  2.     int getPropagationBehavior();  
  3.     int getIsolationLevel();  
  4.     int getTimeout();  
  5.     boolean isReadOnly();  
  6. }  
1) getPropagationBehavior(): 返回事务的传播行为,由是否有一个活动的事务来决定一个事务调用。 
2) getTimeout(): 它返回事务必须在多少秒内完成。 
3) isReadOnly(): 事务是否只读,事务管理器能够根据这个返回值进行优化,确保事务是只读的。 
4) getIsolationLevel(): 返回事务的隔离级别,事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据。 

在TransactionDefinition接口中,定义了五个不同的事务隔离级别 :
1) ISOLATION_DEFAULT 

这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应 

2) ISOLATION_READ_UNCOMMITTED 

这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。 
  例如: 
  Mary的原工资为1000,财务人员将Mary的工资改为了8000,但未提交事务 

  1. Connection con1 = getConnection();  
  2. con.setAutoCommit(false);  
  3. update employee set salary = 8000 where empId =“Mary”;  

与此同时,Mary正在读取自己的工资 

  1. Connection con2 = getConnection();  
  2. select  salary from employee where empId =”Mary”;  
  3. con2.commit();  

Mary发现自己的工资变为了8000,欢天喜地! 
而财务发现操作有误,而回滚了事务,Mary的工资又变为了1000 
  1. //con1  
  2.   con1.rollback();  
像这样,Mary记取的工资数8000是一个脏数据。 
ISOLATION_READ_COMMITTED  保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。 

ISOLATION_REPEATABLE_READ  这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。 

在事务1中,Mary 读取了自己的工资为1000,操作并没有完成 
  1. con1 = getConnection();  
  2. select salary from employee empId =”Mary”;  

在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务. 
  1. con2 = getConnection();  
  2. update employee set salary = 2000;  
  3. con2.commit();  

在事务1中,Mary 再次读取自己的工资时,工资变为了2000 
  1. //con1  
  2. select salary from employee empId =”Mary”;  

在一个事务中前后两次读取的结果并不致,导致了不可重复读。 
使用ISOLATION_REPEATABLE_READ可以避免这种情况发生。 

ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。 

目前工资为1000的员工有10人。 
事务1,读取所有工资为1000的员工。 
  1. con1 = getConnection();  
  2. Select * from employee where salary =1000;  
共读取10条记录 

这时另一个事务向employee表插入了一条员工记录,工资也为1000 
  1. con2 = getConnection();  
  2. Insert into employee(empId,salary) values(”Lili”,1000);  
  3. con2.commit();  

事务1再次读取所有工资为1000的员工 
  1. //con1  
  2. select * from employee where salary =1000;  

共读取到了11条记录,这就产生了幻像读。 
ISOLATION_SERIALIZABLE能避免这样的情况发生。但是这样也耗费了最大的资源。 

getPropagationBehavior()返回事务的传播行为,由是否有一个活动的事务来决定一个事务调用。 
在TransactionDefinition接口中定义了七个事务传播行为。 
PROPAGATION_REQUIRED 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。 
  1. //事务属性 PROPAGATION_REQUIRED  
  2. methodA{  
  3. ……  
  4. methodB();  
  5. ……  
  6. }  
  7.   
  8. //事务属性 PROPAGATION_REQUIRED  
  9. methodB{  
  10.    ……  
  11. }  

使用spring声明式事务,spring使用AOP来支持声明式事务,会根据事务属性,自动在方法调用之前决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务。 

单独调用methodB方法 
  1. main{  
  2.   metodB();  
  3. }  
相当于 
  1. Main{  
  2. Connection con=null;  
  3.   
  4.    rry{  
  5.       con = getConnection();  
  6.       con.setAutoCommit(false);  
  7. //方法调用  
  8. methodB();  
  9. //提交事务  
  10. con.commit();  
  11. }  
  12. Catch(RuntimeException ex){  
  13.   //回滚事务  
  14.   con.rollback();    
  15. }  
  16. finally{  
  17.   //释放资源  
  18.   closeCon();  
  19. }  
  20. }  

Spring保证在methodB方法中所有的调用都获得到一个相同的连接。在调用methodB时,没有一个存在的事务,所以获得一个新的连接,开启了一个新的事务。 

单独调用MethodA时,在MethodA内又会调用MethodB. 

执行效果相当于 
  1. main{  
  2.    Connection con = null;  
  3.    try{  
  4.       con = getConnection();  
  5.       methodA();  
  6.       con.commit();  
  7. }  
  8. cathc(RuntimeException ex){  
  9.  con.rollback();  
  10. }  
  11. finally{  
  12.   closeCon();  
  13. }   
  14. }  

调用MethodA时,环境中没有事务,所以开启一个新的事务. 
当在MethodA中调用MethodB时,环境中已经有了一个事务,所以methodB就加入当前事务。 

PROPAGATION_SUPPORTS 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不使用事务有少许不同。  
  1. //事务属性 PROPAGATION_REQUIRED   
  2. methodA(){  
  3.   methodB();  
  4. }  
  5.   
  6. //事务属性 PROPAGATION_SUPPORTS   
  7. methodB(){  
  8.   ……  
  9. }  

单纯的调用methodB时,methodB方法是非事务的执行的。 
当调用methdA时,methodB则加入了methodA的事务中,事务地执行。 

PROPAGATION_MANDATORY 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。 
  1. //事务属性 PROPAGATION_REQUIRED   
  2. methodA(){  
  3.   methodB();  
  4. }  
  5.   
  6. //事务属性 PROPAGATION_MANDATORY   
  7. methodB(){  
  8.   ……  
  9. }  

当单独调用methodB时,因为当前没有一个活动的事务,则会抛出异常 
throw new IllegalTransactionStateException(“Transaction propagation ‘mandatory’ but no existing transaction found”); 

当调用methodA时,methodB则加入到methodA的事务中,事务地执行。 

PROPAGATION_REQUIRES_NEW 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。 
  1. //事务属性 PROPAGATION_REQUIRED   
  2. methodA(){  
  3.   doSomeThingA();  
  4. methodB();  
  5. doSomeThingB();  
  6. }  
  7.   
  8. //事务属性 PROPAGATION_REQUIRES_NEW   
  9. methodB(){  
  10.   ……  
  11. }  

当单独调用methodB时,相当于把methodb声明为REQUIRED。开启一个新的事务,事务地执行。 

当调用methodA时 
  1. main(){  
  2.   methodA();  
  3. }  
情况有些大不一样.相当于下面的效果。  
  1. main(){  
  2.  TransactionManager tm = null;  
  3. try{  
  4.   //获得一个JTA事务管理器  
  5.    tm = getTransactionManager();  
  6.    tm.begin();//开启一个新的事务  
  7.    Transaction ts1 = tm.getTransaction();  
  8.    doSomeThing();  
  9.    tm.suspend();//挂起当前事务  
  10.    try{  
  11.      tm.begin();//重新开启第二个事务  
  12.      Transaction ts2 = tm.getTransaction();  
  13.      methodB();  
  14.      ts2.commit();//提交第二个事务  
  15.        
  16.    }  
  17.   Catch(RunTimeException ex){  
  18.      ts2.rollback();//回滚第二个事务  
  19.   }  
  20.   finally{  
  21.     //释放资源  
  22.   }  
  23.    //methodB执行完后,复恢第一个事务  
  24.    tm.resume(ts1);  
  25. doSomeThingB();  
  26.    ts1.commit();//提交第一个事务  
  27. }  
  28. catch(RunTimeException ex){  
  29.   ts1.rollback();//回滚第一个事务  
  30. }  
  31. finally{  
  32.   //释放资源  
  33. }  
  34. }  

在这里,我把ts1称为外层事务,ts2称为内层事务。从上面的代码可以看出,ts2与ts1是两个独立的事务,互不相干。Ts2是否成功并不依赖于ts1。如果methodA方法在调用methodB方法后的doSomeThingB方法失败了,而methodB方法所做的结果依然被提交。而除了methodB之外的其它代码导致的结果却被回滚了。 
使用PROPAGATION_REQUIRES_NEW,需要使用JtaTransactionManager作为事务管理器。 

PROPAGATION_NOT_SUPPORTED  总是非事务地执行,并挂起任何存在的事务。 
  1. //事务属性 PROPAGATION_REQUIRED   
  2. methodA(){  
  3.   doSomeThingA();  
  4. methodB();  
  5. doSomeThingB();  
  6. }  
  7.   
  8. //事务属性 PROPAGATION_NOT_SUPPORTED   
  9. methodB(){  
  10.   ……  
  11. }  

当单独调用methodB时,不启用任何事务机制,非事务地执行。 
当调用methodA时,相当于下面的效果 
  1. main(){  
  2.  TransactionManager tm = null;  
  3. try{  
  4.   //获得一个JTA事务管理器  
  5.    tm = getTransactionManager();  
  6.    tm.begin();//开启一个新的事务  
  7.    Transaction ts1 = tm.getTransaction();  
  8.    doSomeThing();  
  9.    tm.suspend();//挂起当前事务  
  10.      methodB();  
  11.    //methodB执行完后,复恢第一个事务  
  12.    tm.resume(ts1);  
  13. doSomeThingB();  
  14.    ts1.commit();//提交第一个事务  
  15. }  
  16. catch(RunTimeException ex){  
  17.   ts1.rollback();//回滚第一个事务  
  18. }  
  19. finally{  
  20.   //释放资源  
  21. }  
  22. }  
使用PROPAGATION_NOT_SUPPORTED,也需要使用JtaTransactionManager作为事务管理器。 

PROPAGATION_NEVER 总是非事务地执行,如果存在一个活动事务,则抛出异常 
  1. //事务属性 PROPAGATION_REQUIRED   
  2. methodA(){  
  3.   doSomeThingA();  
  4. methodB();  
  5. doSomeThingB();  
  6. }  
  7.   
  8. //事务属性 PROPAGATION_NEVER   
  9. methodB(){  
  10.   ……  
  11. }  
单独调用methodB,则非事务的执行。 
调用methodA则会抛出异常 
throw new IllegalTransactionStateException( 
“Transaction propagation ‘never’ but existing transaction found”); 

PROPAGATION_NESTED如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行 

这是一个嵌套事务,使用JDBC 3.0驱动时,仅仅支持DataSourceTransactionManager作为事务管理器。需要JDBC 驱动的java.sql.Savepoint类。有一些JTA的事务管理器实现可能也提供了同样的功能。 

使用PROPAGATION_NESTED,还需要把PlatformTransactionManager的nestedTransactionAllowed属性设为true; 
而nestedTransactionAllowed属性值默认为false; 
  1. //事务属性 PROPAGATION_REQUIRED   
  2. methodA(){  
  3.   doSomeThingA();  
  4. methodB();  
  5. doSomeThingB();  
  6. }  
  7.   
  8. //事务属性 PROPAGATION_NESTED  
  9. methodB(){  
  10.   ……  
  11. }  

如果单独调用methodB方法,则按REQUIRED属性执行。 
如果调用methodA方法,相当于下面的效果 
  1. main(){  
  2. Connection con = null;  
  3. Savepoint savepoint = null;  
  4. try{  
  5.   con = getConnection();  
  6.   con.setAutoCommit(false);  
  7.   doSomeThingA();  
  8.   savepoint = con2.setSavepoint();  
  9.   try  
  10.       methodB();  
  11.   }catch(RuntimeException ex){  
  12.      con.rollback(savepoint);  
  13.   }  
  14.   finally{  
  15.     //释放资源  
  16.   }  
  17.   
  18.   doSomeThingB();  
  19.   con.commit();  
  20. }  
  21. catch(RuntimeException ex){  
  22.   con.rollback();  
  23. }  
  24. finally{  
  25.   //释放资源  
  26. }  
  27. }  
当methodB方法调用之前,调用setSavepoint方法,保存当前的状态到savepoint。如果methodB方法调用失败,则恢复到之前保存的状态。但是需要注意的是,这时的事务并没有进行提交,如果后续的代码(doSomeThingB()方法)调用失败,则回滚包括methodB方法的所有操作。 

嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。 

PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW的区别:它们非常类似,都像一个嵌套事务,如果不存在一个活动的事务,都会开启一个新的事务。使用PROPAGATION_REQUIRES_NEW时,内层事务与外层事务就像两个独立的事务一样,一旦内层事务进行了提交后,外层事务不能对其进行回滚。两个事务互不影响。两个事务不是一个真正的嵌套事务。同时它需要JTA事务管理器的支持。 
使用PROPAGATION_NESTED时,外层事务的回滚可以引起内层事务的回滚。而内层事务的异常并不会导致外层事务的回滚,它是一个真正的嵌套事务。DataSourceTransactionManager使用savepoint支持PROPAGATION_NESTED时,需要JDBC 3.0以上驱动及1.4以上的JDK版本支持。其它的JTA TrasactionManager实现可能有不同的支持方式。 

PROPAGATION_REQUIRED应该是我们首先的事务传播行为。它能够满足我们大多数的事务需求。 



参考推荐:

解惑 spring 嵌套事务

详解spring事务属性

使用R语言获取data.frame中指定列的数据 这里以"df"为例,包含三列数据:“列1”、“列2"和"列3”。通过以上代码,我们成功获取了"列1"和"列3"的数据,并将它们分别存储在了变量"column1"和"column3"中。假设我们有一个名为"df"的data.frame,其中包含了多个列,我们想要提取其中的某一列。符号,我们可以从data.frame中提取出"列2"的数据,并将其赋值给变量"column2"。符号,我们可以轻松提取出data.frame中特定列的数据,并将其存储在变量中供进一步的分析和处理使用。假设我们要获取"列2"的数据。 阅读详情

相关推荐

WRF移动嵌套结合伏羲模型与CFD(PALM)高精度多尺度降尺度分析研究

WRF移动嵌套(Moving Nesting):动态调整高分辨率嵌套网格位置,追踪天气系统(如台风、强对流系统)以提高局地预报精度。伏羲(Fuxi)模型:国产数值模式,提供对WRF模拟的初始及边界条件优化。CFD(Computational Fluid Dynamics)PALM模型:精细化局地流场、湍流、温度分布。

m0_57411304的博客 1716

spring事务的五种属性

spring 事务深入理解

Never stop for the code 3481

网络安全实战:从Wireshark到BurpSuite的抓包技巧解析

本文深入解析了Wireshark和BurpSuite在网络安全抓包中的实战技巧,从基础对比到高级过滤、核心模块应用及安全测试避坑指南。通过详细的操作步骤和案例分析,帮助读者掌握数据包抓取与分析的核心技能,提升网络安全防护能力。

weixin_29207533的博客 574

spring中的事务

Spring的事务处理 1. 什么是事务? 保证业务操作完整性的一种数据库机制 事务的4特点: A C I D 1. A 原子性 2. C 一致性 3. I 隔离性 4. D 持久性 2. 如何控制事务 JDBC: Connection.setAutoCommit(false); Connection.commit(); Connection.rollback(); Mybatis: Mybatis自动开启事务 sqlSession(Connection

Javaer 362

反射机制——通过反射调用service中方法

需求:现在有一群service接口,有同一个方法名称,内部逻辑除了调用不同的调用自身的方法外其他基本都一致,那现在就需要一个独立的方法来勾勒出这个方法 1.SpringContextUtil package com.XXX.report.util; import org.apache.log4j.Logger; import org.springframework.beans.BeansE...

东天里的冬天 8521

使用Google Earth Engine(GEE)的Python API,您可以将经纬度坐标转换为Landsat影像的路径/行号

使用Google Earth Engine(GEE)的Python API,您可以将经纬度坐标转换为Landsat影像的路径/行号。在这个示例中,我们选择了一个位于加利福尼亚州旧金山市附近的点,其经度为-122.084,纬度为37.421998。首先,我们需要导入必要的库和模块。接下来,我们定义一个函数,该函数将接收经度和纬度作为输入,并返回对应的Landsat路径/行号。最后,我们提取路径和行号的值,并将它们作为结果返回。现在,我们可以使用这个函数来获取特定点的Landsat路径/行号。

VwajAlgorithm的博客 349

spring--事务详解

我们常说的事务,一般指数据库事务。数据库事务是指 一个逻辑工作单元中执行的一系列(数据库操作),要么一起成功,要么一起失败当工作单元中的所有操作全部正确完成时,工作单元的操作才会生效,如果检测到一个错误,程序执行回滚操作,恢复原状,要么都执行,要么都不执行逻辑工作单元就是一个不可分割的操作序列,操作序列就是一系列的数据库操作Spring的事务就是对数据库事务的封装,最后本质的实现还是在数据库,假如数据库不支持事务的话,spring的事务是没有作用的。

m0_73856804的博客 1872

C# 与华中数控设备通信:数控机床自动化控制与实时监测系统

华中数控系统与C#通信开发指南 核心要点 通信基础 支持串口(RS232/RS485)和以太网两种连接方式 协议选择:通用Modbus协议或华中自定义HNC协议 关键数据映射表明确各参数对应的寄存器地址和功能码 系统架构 四层架构:设备层→通信层→业务层→应用层 包含实时数据采集、指令下发、状态监控、异常处理全流程 支持Modbus和HNC协议动态切换 代码实现 串口通信使用NModbus库简化开发 提供连接管理、数据读取、指令下发完整示例 包含异常处理和超时重连机制 应用价值 实现数控机床远程监控和自动化

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 2020

Spring事务畅谈:深入讨论一下 @Transactional 注解

前言@Transactional 注解是我们在使用spring 相关内容时,经常需要使用的,网络上亦容易找到其使用方法和解析。我们在这里结合笔者的使用经验来,深入讨论一下 @Transactional 注解一、理解 Spring 事务我们在讨论Spring 的事务前,必须先了解计算机领域的“事务”,代表着什么含义。事务 其实就是一种机制,我们常说某某中间件支持“事务”,那么就代表他能实现事务的几种...

Java笔记虾 607

【26美赛A题】2026美赛数学建模(MCM/ICM)思路解析及代码分享

本文介绍了2026年美赛数学建模A题的解题思路与方法。A题通常属于连续型系统问题,重点在于构建可解释的机理模型,通过将现实机制转化为动态方程进行仿真预测。文章提出了通用建模路线,包括机理抽象、模型假设、动态建模、参数识别、系统仿真和情景预测六个阶段。专栏将提供从机理到方程的系统建模思路、参数标定方法、Python/Matlab实现代码以及高分论文模板。内容适合参加2026美赛A题、偏重物理/工程建模方向的参赛队伍,旨在提升机理建模能力。后续将更新完整题解和源码。

一键难忘的博客 2011

KingSCADA实现按钮点击效果

哈喽,你好啊,我是雷工!在做SCADA项目的时候,按钮是不可缺少的功能,但软件自带的按钮太丑,已经无法满足现如今客户对界面美观度的要求。这时候就需要UI小姐姐设计美观大气的SCADA界面,但UI设计的按钮切图放到程序中只是图片素材,当添加了按钮功能时,虽然能实现按钮功能,但没有任何点击效果;当遇到有需要连锁条件才能点击的按钮时,操作员无法区分是有连锁点击了没反应,还是系统界面卡死了导致的没点击成功,这时候有点击效果就能很好的区分这种问题。本篇介绍一种实现按钮点击效果的方法,以下为操作过程。

做有价值的事,积累有价值的笔记! 2765

Spring事务详解

详细解释了spring事务的功能及声明式和编程式事务的使用示例及其事务失效原因等。

qq_53986627的博客 1345

Matlab 普通kriging(克里金)插值

Matlab 普通kriging(克里金)插值

dayuhaitang1的博客 4571

Spring事务的传播属性

所谓Spring事务的传播属性,就是定义在存在多个事务同时存在的时候,Spring应该如何处理这些事务的行为。这些属性在TransactionDefinition中定义,具体常量的解释见下表: 常量名称 常量解释 PROPAGATION_REQUIRED 支持当前事务。 如果当前有事务,则加入当前事务;如果当前没有事务,就新建一个事务。 这是最常见的选择,...

学无止境 1609

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

详解spring中的事务,事务属性和事务传播模式

详解spring中的事务,事务属性和事务的传播模式

weixin_70001451的博客 845

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

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

Spring-事务属性

1.隔离属性 默认值2.传播属性 Required(默认值) 增删改 Supports 查询操作3.只读属性 readOnly false 增删改 true 查询操作4.超时属性 默认值 -15.异常属性 默认值增删改查询操作。

qq_44766305的博客 825

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Spring中配置事务属性

Spring中配置事务属性 通常采用简单的注解配置属性: @Transactional(属性名称=属性值) Isolation 指定事务的隔离级别@Transactional(isolation = Isolation.DEFAULT) 读已提交 READ_COMMITTED 读未提交 READ_UNCOMMITTED 可重复读 REPEATABLE_READ 串行化 SERIALIZABLE 默认值 DEFAULT: (MySQL: 可重复读、Oracle: 读已提交) timeout 设置

GuessHat的博客 548

Spring 事务传播属性

事务传播属性 •当事务方法被另一个事务方法调用时, 必须指定事务应该如何传播. 例如: 方法可能继续在现有事务中运行, 也可能开启一个新事务, 并在自己的事务中运行. •事务的传播行为可以由传播属性指定. Spring 定义了 7 种类传播行为. REQUIRED 传播行为 •当 bookService 的 purchase() 方法被另一个事务方法 checkout() 调用时,...

Hern(宋兆恒) 573

Spring事务属性解析核心解密

该方法用于解析事务属性,具体步骤如下: 检查方法是否为public(若配置仅允许public方法) 获取真实目标类,跳过CGLIB代理 查找最具体的方法实现,处理接口继承情况 解析桥接方法,确保找到原始方法 按优先级查找事务属性: 方法级别注解 类级别注解 原始方法及声明类(回退机制) 最终返回TransactionAttribute对象或null(表示无事务)。该方法实现事务属性的精确解析,支持继承、代理和泛型等复杂场景。

m0_37607945的博客 1010

Spring系列:Spring事务处理与事务属性概述

前言 1.事务处理 1.1 什么是事务 1.2 事务编码的核心(不包含Spring框架的情况下的分析) 1.3 Spring事务开发编程(使用Spring框架实现事务) 2. Spring中的事务属性(Transaction Attribute) 2.1 什么是事务属性 2.2 如何添加事务属性 2.3 事务5大属性说明 2.4 事务属性配置总结 前言 本章主要对Sping的事务做一个简单的概述 ▲. 事务处理简单介绍 ▲. 事务属性的简单描述 1. 事务处理 1.1 什么是事务 什么是事务? ⑴

llzz_zzll的博客 341

【Spring 持久层】Spring 事务开发、事务属性详解

持久层事务回顾Spring 控制事务的开发Spring 中的事务属性(Transaction Attribute)什么是事务属性事务属性详解隔离属性(ISOLATION)传播属性(PROPAGATION)只读属性超时属性异常属性 事务回顾 什么是事务? 事务时保证业务操作完整性的一种数据库机制。 事务的 4 大特点: A、C、I、D A 原子性 C 一致性 I 隔离性 D 持久性 如何控制事务?(JDBC、Mybatis) JDBC Connection.setAutoCommit(false);

萌宅鹿的技术小屋 2986

spring 事务属性详解

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

yygr的博客 486

spring事务传播属性

spring事务传播属性 在 spring的 TransactionDefinition接口中一共定义了六种事务传播属性: PROPAGATION_REQUIRED – 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 PROPAGATION_SUPPORTS – 支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY – 支持当前事务,如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRES_NEW – 新建事务,如果当前存在

xyzroundo的专栏 1438

Spring13:Spring中的事务属性

目录1.什么是事务属性2.如何添加事务属性3.事务属性详解3.1.隔离属性(isolation)3.2事务的传播属性3.3事务的只读属性(readOnly)3.4.事务的超时时间属性3.5.事务的异常属性4.事务属性常见配置总结5.基于标签的事务配置方式(事务开发的第二种形式)5.1基于@Transactional注解的事务开发回顾5.2基于标签的事务配5.3每个方法都要进行配置:太冗余 1.什么是事务属性 属性:描述物体特征的一些列值 事务属性:主要从5个维度来描述事务。 1.隔离属性 2.传播属性 3.

tttxxl的博客 255

Spring 事务的隔离级别、设置隔离事务属性、设置回滚事务属性、设置超时和只读事务属性

事务的隔离级别 •从理论上来说, 事务应该彼此完全隔离, 以避免并发事务所导致的问题. 然而, 那样会对性能产生极大的影响, 因为事务必须按顺序运行. •在实际开发中, 为了提升性能, 事务会以较低的隔离级别运行. •事务的隔离级别可以通过隔离事务属性指定 Spring 支持的事务隔离级别: •事务的隔离级别要得到底层数据库引擎的支持, 而不是应用程序或者框架的支持. •Orac...

Hern(宋兆恒) 1058

Spring的事务的传播属性

Spring事务有7种传播属性: 1.PROPAGATION_REQUIRED:如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。 2.PROPAGATION_SUPPORTS:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 3.PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。 4.PROPAGATION_REQUIRES_NEW...

uk8692的专栏 600
上一篇: smtp服务认证过程
下一篇: bean标签scope属性
光与热
博客等级 码龄11年 55粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值