详解spring事务属性

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

代码
  1. TransactionDefinition   
  2. public interface TransactionDefinition {   
  3.     int getPropagationBehavior();   
  4.     int getIsolationLevel();   
  5.     int getTimeout();   
  6.     boolean isReadOnly();   
  7. }  
<script>render_code();</script>

 

getTimeout()方法,它返回事务必须在多少秒内完成。
isReadOnly(),事务是否只读,事务管理器能够根据这个返回值进行优化,确保事务是只读的。
getIsolationLevel()方法返回事务的隔离级别,事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据。

在TransactionDefinition接口中定义了五个不同的事务隔离级别
ISOLATION_DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应
ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
例如:
Mary的原工资为1000,财务人员将Mary的工资改为了8000,但未提交事务

代码
  1. Connection con1 = getConnection();   
  2. con.setAutoCommit(false);   
  3. update employee set salary = 8000 where empId ="Mary";  
<script>render_code();</script>
与此同时,Mary正在读取自己的工资
代码
  1. Connection con2 = getConnection();   
  2. select  salary from employee where empId ="Mary";   
  3. con2.commit();  
<script>render_code();</script>

 

Mary发现自己的工资变为了8000,欢天喜地!
而财务发现操作有误,而回滚了事务,Mary的工资又变为了1000

代码
  1. //con1   
  2.   con1.rollback();  
<script>render_code();</script>
像这样,Mary记取的工资数8000是一个脏数据。

 

ISOLATION_READ_COMMITTED 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。

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

在事务1中,Mary 读取了自己的工资为1000,操作并没有完成

代码
  1. con1 = getConnection();   
  2. select salary from employee empId ="Mary";  
<script>render_code();</script>

 

在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务.

代码
  1. con2 = getConnection();   
  2. update employee set salary = 2000;   
  3. con2.commit();  
<script>render_code();</script>

 

在事务1中,Mary 再次读取自己的工资时,工资变为了2000

代码
  1. //con1   
  2. select salary from employee empId ="Mary";  
<script>render_code();</script>

 

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

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

目前工资为1000的员工有10人。
事务1,读取所有工资为1000的员工。

代码
  1. con1 = getConnection();   
  2. Select * from employee where salary =1000;  
<script>render_code();</script>共读取10条记录

 

这时另一个事务向employee表插入了一条员工记录,工资也为1000

代码
  1. con2 = getConnection();   
  2. Insert into employee(empId,salary) values("Lili",1000);   
  3. con2.commit();  
<script>render_code();</script>

 

事务1再次读取所有工资为1000的员工

代码
  1. //con1   
  2. select * from employee where salary =1000;  
<script>render_code();</script>

 

共读取到了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. }  
<script>render_code();</script>
使用spring声明式事务,spring使用AOP来支持声明式事务,会根据事务属性,自动在方法调用之前决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务。

 

单独调用methodB方法

代码
  1. main{   
  2.   metodB();   
  3. }  
<script>render_code();</script>
相当于
代码
  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. }  
<script>render_code();</script>
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. }  
<script>render_code();</script>
调用MethodA时,环境中没有事务,所以开启一个新的事务.
当在MethodA中调用MethodB时,环境中已经有了一个事务,所以methodB就加入当前事务。

 

PROPAGATION_SUPPORTS 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不使用事务有少许不同。

 

代码
  1. //事务属性 PROPAGATION_REQUIRED    
  2. methodA(){   
  3.   methodB();   
  4. }   
  5.   
  6. //事务属性 PROPAGATION_SUPPORTS    
  7. methodB(){   
  8.   ……   
  9. }  
<script>render_code();</script>
单纯的调用methodB时,methodB方法是非事务的执行的。
当调用methdA时,methodB则加入了methodA的事务中,事务地执行。

 

PROPAGATION_MANDATORY 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

 

代码
  1. //事务属性 PROPAGATION_REQUIRED    
  2. methodA(){   
  3.   methodB();   
  4. }   
  5.   
  6. //事务属性 PROPAGATION_MANDATORY    
  7. methodB(){   
  8.   ……   
  9. }  
<script>render_code();</script>
当单独调用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. }  
<script>render_code();</script>
当单独调用methodB时,相当于把methodb声明为REQUIRED。开启一个新的事务,事务地执行。

 

当调用methodA时

代码
  1. main(){   
  2.   methodA();   
  3. }  
<script>render_code();</script>情况有些大不一样.相当于下面的效果。
代码
  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. }  
<script>render_code();</script>
在这里,我把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. }  
<script>render_code();</script>
当单独调用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. }  
<script>render_code();</script>使用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. }  
<script>render_code();</script>单独调用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. }  
<script>render_code();</script>
如果单独调用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. }  
<script>render_code();</script>当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应该是我们首先的事务传播行为。它能够满足我们大多数的事务需求。

Lammps不同亲疏水性粗糙表面的润湿行为模拟(包含in文件) Lammps粗糙表面的润湿行为模拟(包含in文件)前言—润湿行为模拟一、物理模型构建二、具体in文件—in文件内循环亲疏水性三、具体in文件—分子模板构建初始模型以及平衡态模拟四、全部代码(基地粗糙表面只提供data文件) 前言—润湿行为模拟 润湿现象:当液体与固体接触时,液体的附着层将沿固体表面延伸。当接触角 θ\rm \thetaθ 为锐角时,液体润湿固体,若θ为零时,液体将展延到全部固体表面上。润湿现象的产生与液体和固体的性质有关。(来自百度百科) 润湿行为的本质是固液之间的相互作用,也就是分子间的范 阅读详情

相关推荐

如何将rvt(BIM)转换为点云格式

1、为什么将BIM转换为点云格式? 如何使设计BIM与真实场景进行配准,分析在建、未建、已建构建的情况,真实场景是通过点云生产的,和点云配准需要相同的格式。 2、如何转换? 实用工具revit,转换过程如下图,这样就可以转换成三角网格形式。 3、FBX还需要进行一次转换,即转换成点云常用的类型,如bin\ply\pcd等格式。 需要软件cloudcompare.exe,软件下载地址百度云 链接:https://pan.baidu.com/s/1pflcKNc04loBnS1yKR39hw 提取码:obaf

self_Name_的博客 4489

事务的传播属性、隔离级别等以及在Spring中的设置

1. 事务的传播属性 # 事务传播属性 事务传播:就是在多个业务层之间相互调用时传递事务的过程称之为事务传播 将事务对象在业务层之间进行传递的过程 (本来不同的业务层是不同的事务对象,那么我们在一个业务层就不能调用其他业务层的方法了,但是spring框架提供了 事务传播属性,可以在一个事务层调用其他事务层的方法时将事务对象也传递过去,这样即使调用了别的事务层,但是由于 事务对象是一样的,那么这就成为了一个原子操作,这样这两个(多个)事务要么一起成功,要么有一

qq_50313418的博客 2266

A-Level CS 计算机科学 考试知识点——考试介绍&第1章

前言:该系列文章是本人在给学生辅导本课程的过程中结合英文教材所总结的,该系列共分为30章,主要介绍了考试的核心知识点。若需要A-Level CS 计算机科学考试辅导也可以私信我。 目录 关于A-Level CS 计算机科学考试 考试简介 考试内容 考试时间 评分情况 第1章 信息表示 本章学习内容 1.01 数字系统 1.02 数字的内部编码 整数编码(Coding for integers) 二进制编码的十进制(Binary coded decimal——BCD) 1.03.

王俊的博客 6457

拿下 Spring 事务

事务是数据库操作的最基本单元,是逻辑上的一组操作,要么都成功,要么都失败。是一个不可分割的工作单元。

老男孩的架构路 1663

室内无人机自主定位:融合Mid360激光雷达与光流传感器的无GPS导航实践

本文详细介绍了室内无人机自主定位技术,通过融合Mid360激光雷达与光流传感器实现无GPS导航。文章分析了技术挑战、硬件配置、算法优化及实战调试,展示了在复杂室内环境中如何实现厘米级定位精度,为仓库巡检、隧道勘测等场景提供可靠解决方案。

weixin_30500105的博客 532

从零部署DeepSeek V4 Flash:NVIDIA DGX Spark实战指南

GPU加速计算已成为现代人工智能基础设施的核心,其原理是通过并行处理架构大幅提升深度学习模型的训练与推理效率。在AI工程实践中,NVIDIA GPU凭借CUDA生态和专用驱动栈,为大规模语言模型部署提供了硬件基础。本文聚焦于企业级AI服务器部署场景,针对NVIDIA DGX Spark多节点系统的硬件初始化、驱动兼容性配置、容器化部署等关键环节,提供从系统层到应用层的完整解决方案。通过vLLM推理框架的实战配置,演示如何将DeepSeek V4 Flash模型高效部署于多GPU环境,涵盖Tensor Par

weixin_32296621的博客 377

spring的 TransactionDefinition.PROPAGATION_NESTED 嵌套事务 应用说明

1,今天想使用嵌套事务。发现嵌套事务是不能 手动控制 commit 提交的。 它会 受最外层的 事务控制的。最外层事务提交它才会提交。如果最外层异常回滚,它一样会回滚。 因此 感觉嵌套事务其实用处并不大了。可以不用的 默认spring 是不能开启嵌套事务,需要设置 我们要设置 transac...

chuncui2576的博客 1846

使用Matlab与V-REP联合仿真

在Matlab中,我们可以使用V-REP提供的远程API(Application Programming Interface)来连接到V-REP仿真环境。为了连接Matlab与V-REP,我们需要在Matlab中添加V-REP的远程API函数库。你可以根据具体的需求编写Matlab脚本来控制V-REP场景中的机器人,并进行系统建模和仿真。一旦成功连接到V-REP,我们可以使用Matlab来控制V-REP场景中的机器人。在本文中,我们将介绍如何使用Matlab与V-REP进行联合仿真,并提供相应的源代码。

HackMasterX的博客 1853

【spring】spring 的事务(transaction) 四 嵌套事务PROPAGATION_NESTED

文章目录1. 什么是嵌套事务PROPAGATION_NESTED2. PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW的区别2.1 验证PROPAGATION_REQUIRES_NEW内层事务执行完就立即提交2.2 验证PROPAGATION_NESTED 内层事务执行完未立即提交2.3 验证PROPAGATION_NESTED 内层事务回滚 相关文章 spring 的事务(transaction) 一 基础概念介绍 spring 的事务(transaction) 二

m0_45406092的博客 1万+

2022年12月机器人技术等级考试试卷(三级实操) 试题解析

2022年12月机器人技术等级考试试卷(三级实操) 试题解析

http://www.cierobot.com 1522

探索数据库领域 SQL 的 JSON 数据处理技巧

在当今数字化时代,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,被广泛应用于各种领域,如 Web 应用、移动应用、大数据处理等。数据库作为数据存储和管理的核心,需要具备处理 JSON 数据的能力。本文章的目的在于深入探索 SQL 语言在数据库中处理 JSON 数据的技巧,涵盖从基础的 JSON 数据查询到复杂的 JSON 数据操作,帮助读者全面了解和掌握 SQL 处理 JSON 数据的方法。

2502_91592937的博客 924

spring 事务属性详解

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

yygr的博客 486

【大模型工程局】告别单打独斗:手把手带你构建多智能体系统(MetaGPT 启示录)

想象一下,不再是只有一个全知全能的 AI,而是有一群各有所长、能够独立思考和行动的“智能体”(Agent)。它们生活在一个共同的环境中,可以相互交流、协作完成共同目标,也可能为了有限资源而相互竞争。这就是多智能体系统(MAS)的核心图景。MAS 的关键特征:自治性 (Autonomy):每个智能体都能独立感知环境、做出决策并执行动作,无需外部直接控制。交互性 (Interaction):智能体之间可以通过某种通信机制(显式或隐式)交换信息、协调行为。

高校图书馆高级系统架构师/研究馆员,推动高校AI从概念演示到可评审、可交付、可运维:路线图与立项评审、PoC交付、评测回归与上线运维(Baseline/Eval/Ops)。 1183

Spring 中事务属性详解

Spring 中事务属性详解 Isolation 指定事务的隔离级别 读已提交 READ_COMMITTED 读未提交 READ_UNCOMMITTED 可重复读 REPEATABLE_READ 串行化 SERIALIZABLE 默认值 DEFAULT: (MySQL: 可重复读、Oracle: 读已提交) timeout 设置单位为秒的超时。 默认值是 -1 表示使用数据库的设置。 readOnly 设置是否是只读事务。 当你能确保整个事务过程中只对数据库执行Select操作的时候

weixin_47371330的博客 280

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

weixin_70001451的博客 845

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

注解驱动事务:Spring中基于注解的事务属性配置详解

Spring的基于注解的事务配置为开发者提供了更为便捷和直观的方式来定义事务属性。本文将深入讨论如何使用注解来配置Spring事务的隔离级别、传播行为等关键属性。我们将详细介绍@Transactional注解的各种参数,并提供实际案例演示如何应用这些注解来管理事务。

学而时习之,不亦说乎?温故而知新,可以为师矣! 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【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事务属性和Transactional配置

详解spring事务属性:[url]http://www.iteye.com/topic/78674[/url] Transactional配置 :[url]http://xgbjmxn.iteye.com/blog/1166575[/url] 写的很清楚。 .

pyzheng的专栏 131

【Spring】详解spring事务属性

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

diaowenchan1577的博客 109

Spring事务属性详解

Spring事务属性详解

dghggij的博客 196

Spring中事务的传播属性详解

我们用Spring时,很多时候都会用到他的声明式事务,简单的在配置文件中进行一些规则配置,利用Spring的AOP功能就能轻松搞定事务问题;这里面就涉及到一个事务的传播属性问题【Propagation】,他在TransactionDefinition接口中定义,有兴趣可以看看src,共有7种选项可用: PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建

老唐 的专栏 1517

【Spring】@Transactional事务属性详解

注解开启事务,其中注解的各种属性详解。

hhb442的博客 1129
上一篇: 揭秘jbpm流程引擎内核设计思想及构架
下一篇: spring 中的事务小结
wang20051
博客等级 码龄22年 2粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值