成功解决事务嵌套

Spring事务的嵌套的详细理解,以及事务失效的场景解惑 Spring事务、Spring事务的传播属性、事务的嵌套、以及Spring事务失效的场景举例 阅读详情

JTA事务的嵌套

  由于前两篇帖子都是关于事务的讨论 (J2EE中的事务处理 、 事务服务浅析),没有讨论到事务嵌套时的解决办法,这两天一直在琢磨,如何才能高效、灵活的解决事务的嵌套问题呢?
  既然web容器可以判断当前方法是否处在事务中(JTA事务中提交java.sql.Connection.commit()会报错),那么它是如何判断的呢?带着这个疑问,追查了一下resin容器源码的事务部分,发现了一个类:javax.transaction.Status,用来标明事务状态代码,而javax.transaction.UserTransaction.getStatus()可以取得事务当前的状态!
  这样的话,就比较简单了。既然可以随时取得事务的状态编码,而且又能清楚知道每个状态码的含义,就可以对事务进行再次封装了

我的解决办法

package com.javer.test;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.transaction.Status;
import javax.transaction.UserTransaction;

/**
 
* 事务管理器,对事务再次进行封装
 
* <p>@author javer QQ:84831612</p>
 
* @date 2005
 
*/
public class TransactionManager {

 
private UserTransaction tx = null;

 
/**
  
* 是否自己管理事务(true:自己提交、回滚事务;false:当前事务是嵌套事务,自己不进行事务管理)
  
*/
 
private boolean transactionBySelf = true;

 
private TransactionManager(){}

 
public static TransactionManager getInstance() throws Exception {
   
Context ic = new InitialContext();
    UserTransaction _tx = (UserTransaction) ic.lookup("java:comp/UserTransaction"); //resin服务器中取得UserTransaction

    TransactionManager tm = new TransactionManager();
    tm.tx = _tx;
    if(_tx.getStatus() != Status.STATUS_NO_TRANSACTION)
    tm.transactionBySelf = false;

   
return tm;
 
}

 
public void beginTransaction() throws Exception {
   
if (tx == null)
   
return;
    if(tx.getStatus() != Status.STATUS_NO_TRANSACTION)
      transactionBySelf = false;

   
if (transactionBySelf) {
      tx.begin();
      //
System.out.println("TransactionManager:打开事务!");
   
}//else {
     
//System.out.println("TransactionManager:已经处于事务中了!所以没有再次打开事务!");
    //
}
 
}

 
public void commitTransaction() throws Exception {
   
if (tx == null)
     
return;
   
if (transactionBySelf) {
      tx.commit();
     
//System.out.println("TransactionManager:提交事务!");
   
}// else {
     
//System.out.println("TransactionManager:已经处于事务中了!所以没有提前提交事务!");
    //
}
 
}

 
public void rollbackTransaction() throws Exception {
   
if (tx == null)
     
return;
   
if (transactionBySelf) {
      tx.rollback();
     
//System.out.println("TransactionManager:回滚事务!");
   
}// else {
     
//System.out.println("TransactionManager:已经处于事务中了!所以没有提前回滚事务!");
    //
}
 
}
}

调用示例

方法a
void a() throws Exception {
  TransactionManager tm = TransactionManager.getInstance();
  try{
    tm.beginTransaction();

    System.out.println("JaverTest:数据库操作!");

    b(); //调用方法b

    tm.commitTransaction();
  }catch(Exception e){
    tm.rollbackTransaction();
    throw e;
  }
}

方法b
void b() throws Exception {
  TransactionManager tm = TransactionManager.getInstance();
  try{
    tm.beginTransaction();

    System.out.println("JaverTest:数据库操作!");

    tm.commitTransaction();
  }catch(Exception e){
    tm.rollbackTransaction();
    throw e;
  }
}

PHP中实现MySQL嵌套事务的两种解决方案 一、问题起源 在MySQL的官方文档中有明确的说明不支持嵌套事务: 1. Transactions cannot be nested. This is a consequence of the implicit commit performed for any current transaction when you issue a START TRANSACTION statement or 阅读详情

相关推荐

Android SQLite 支持嵌套事务吗?

Android SQLite相关java源码中多次提到支持 nested transaction。 而SQLite本身不支持嵌套事务,只能使用 savepoint 代替。 https://www.sqlite.org/lang_savepoint.html 嵌套事务即是类似于 BEGIN BEGIN ...... 也许没有太多人会直接这样写,更多情况是,一个程序执行

E飞 5758

事务嵌套和捕获异常的关系以及问题解决方案

默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚。 spring aop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常,但可以通过配置来捕获特定的异常并回滚 。 换句话说在service的方法中不使用try catch 或者在cat...

Xiaoqiu的博客 1915

SqlServer嵌套事务机制了解

SQL Server 中的嵌套事务提供了一种将复杂事务逻辑分解为多个部分的方法,但它的实际行为并不如某些其他数据库那样独立管理每个事务,而是依赖于最外层事务的提交和回滚。正确地使用嵌套事务有助于简化事务管理和错误处理,但也需要注意其局限性,尤其是在回滚和提交的行为上。在 SQL Server 中,子事务回滚不会自动导致外层事务回滚。只有在外层事务中显式调用时,所有嵌套事务才会被回滚。子事务的回滚仅影响子事务内部的操作,而不影响外层事务的状态,除非外层事务遇到错误并选择回滚。

极客神殿 1358

mysql 多数据源与事务嵌套不兼容解决方案

最近,因为某一个项目需求的数据量过大,已经对其它服务造成了一定的影响。所以为了给数据库减负,将这部分业务需求涉及到的数据给迁到新库中。但这就出现了个问题,这部分业务涉及到的业务表我虽然迁到新库中,但涉及到一些扩展类的业务表,比如日志信息等,因为监控的是整个系统的日志,所以肯定不能把这个表给单独拿出来。所以,这里就涉及到了双数据源的访问。并且在一个方法中涉及到双数据源问题,切换以及对应的事务信息怎么解决。

key_wu的博客 972

封包(一)(雷电模拟器+ProxyDroid+查尔斯3.93+WPE)

自从换了工作就没有给大家分享一些干活,在加上陪伴自己的孩子没有时间更新文章了,这只能在晚上给大家写文档了,我最近在游戏公司上班,研究封包。我把这些东西都做成了笔记,我想有些东西是大家都想弄明白d ...

寒梅独自开 1万+

威联通改装飞牛fnOS全攻略:从刷机到Docker影视部署

NAS系统是家庭数字存储的核心,x86架构的威联通设备凭借通用引导和驱动支持,成为改装替代系统的理想平台。飞牛fnOS作为基于Debian的国产NAS系统,以简洁UI、内置Docker和影视墙以及硬件转码能力,吸引了大量玩家。通过U盘引导安装、BIOS调整、系统盘SSD部署,可实现系统切换;原机械硬盘可挂载为存储池,配合Docker部署下载、远程访问等容器,影视中心自动削刮海报墙,硬件转码保障4K播放。改装过程需注意引导失败、硬盘识别、核显驱动等问题。这套方案能让老旧威联通焕发新生,兼顾易用性与扩展性。本文

weixin_33585822的博客 760

关于 Spring 中事务的嵌套,你了解多少?

5.1 事务方法访问修饰符不是public,导致事务失效比如下图中的代码其实如果是JDK的动态代理 就不允许这种情况,因为JDK动态代理需要有接口,而接口中是不能有 私有方法的,如果是CGLIB动态代理的话也是不允许的代理private方法的5.2 如果事务方法是static、final的,同样无法通过动态代理,事务也是不会生效的。Spring的声明式事务是基于动态代理实现的,我们无法重写final修饰的方法;

2301_77463738的博客 769

未隔离电源设备使用usb转串口调试导致串口模块爆炸烧坏事故记录

这个事就发生在前两天,我们公司的wifi模块被客户用到了咖啡机上,客户寄了一台整机给我们协助调试,还送了几包咖啡豆,本想着还能打个咖啡喝一喝的,但就在咖啡机刚寄过来第一天,就出事了。而这个事故的发生,竟然仅仅是因为同事接了个串口模块到电脑调试打印导致的。谁也想不到,这个3.3V的供电的wifi模块居然还有这么大的威力。直接将usb转TTL串口模块的转换芯片给爆开了,咖啡机也给弄坏了,据同事描述当时情况就只见到一片火光和一声巨响,状况比较惨烈,所幸的是笔记本电脑没有烧坏,但是直接给崩蓝屏了。 ...

fangye945a的博客 6192

mysql 不同连接的事务 会嵌套_事务嵌套的解决之道

前言我们在开发一个复杂的系统时可能经常出现这样的场景:比如,A函数中调用了B函数,而A函数和B函数同时都使用了事务,这样就出现了事务嵌套。在MySQL的官方文档中有明确的说明MySQL是不支持嵌套事务的:Transactions cannot be nested. This is a consequence of the implicit commit performed for any curr...

weixin_39789094的博客 480

vTaskStartScheduler()详解

是启动 FreeRTOS 实时内核的“扳机”。在调用它之前,你只是创建了一些任务结构,但它们都处于“待命”状态,系统仍然在按传统的裸机前后台方式运行。调用这个函数后,FreeRTOS 内核会接管系统的控制权,开始根据优先级调度你创建的任务,多任务环境才真正开始。关键点:它没有参数。它的所有行为都由中的配置宏控制。它通常不会返回。一旦调用,除非没有任务可以运行(或者你显式地停止了调度器),否则程序流永远不会回到main()函数中调用它的下一行。是一个没有参数但行为由精密控制的函数。

Shylock_Mister的博客 1594

关于RT-Thread中PWM无法正常输出的学习

按照官方的PWM配置,并没有输出PWM,网上有比较多的办法,试了很多,有些还是不能实现输出,这里做个记录。记录自己完成PWM输出的过程,以及修改的地方。 关于STM32CubeMX配置就不多说了,网上有很多。 首先必定是按照流程来,一定一定按照流程来!!! 需要注意的是加上通道数!!!! 这是流程上没有的,也是RTT的一点小BUG吧 配上board.c中添加的代码,我用的是PA2定时2的通道3,需要使用的朋友修改对应定时器和GPIO! void HAL_TIM_Base_MspInit(TIM_Han

weixin_42566346的博客 3554

Spring中解决Aop 事务嵌套回滚问题

今天被坑了,这是部分代码 //组装操作日志  这个增强里面后面的两个参数必须一样,为函数执行后返回的结果  @AfterReturning(value="addLog()",argNames="rtv",returning="rtv")  public void packLogs(JoinPoint joinPoint,Object rtv) throws Throwable {     

cuibruce的博客 5062

保姆级教程:用GROMACS的FEP方法计算小分子结合自由能(附完整mdp配置)

本文提供了一份详细的GROMACS自由能微扰(FEP)计算教程,涵盖从系统准备、参数配置到结果分析的全流程。通过具体案例演示如何计算小分子结合自由能,包括λ窗口设计、动力学参数优化及并行化执行技巧,帮助研究者克服FEP计算中的常见问题,获得可靠的自由能数据。

weixin_30598225的博客 353

Spring 嵌套事务回滚的问题

目录 Spring 嵌套事务回滚的问题 问题描述 项目背景: 问题重现 1. Spring的声明事务 2. 事务的事件处理逻辑 3.实际业务Service层方法 4.Druid数据源的配置 5.测试执行 日志分析 分析问题产生的原因 总结 Spring 的事务代码分析 Spring 的事务传播类型总结 新的问题 方案1 方案2 Spring 嵌套事务回滚的问题 问题描述 线上的项目出现,Spring的事务回滚了,但仍触发了事务提交成功的事件。这就导致原先通过异

飞一站的博客 2890

把 MCP Server 直接装进 SAP ABAP:用 Unlimited Display Tools 打通 Agentic SDK 与 SAP ECC / S/4HANA 的最后一公里

摘要:AI与SAP集成的MCP解决方案 企业在AI集成中面临工具链复杂、数据对接繁琐的挑战。Model Context Protocol (MCP)通过标准化工具与数据暴露方式,将集成复杂度从N×M降至N+M。在SAP生态中,MCP Server for SAP直接部署于ABAP层,利用DDIC/CDS视图对接各类Agent SDK,避免中间件风险。 MCP核心包含三类对象: Tools:带元数据的可执行动作 Resources:结构化上下文数据 Prompts:可参数化提示模板 ABAP层实现MCP Se

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 683

Navicat从入门到精通:数据库管理全攻略

本文系统梳理Navicat数据库管理工具的核心应用体系。从基础的安装与多类型数据库连接入手,详解数据库与数据表的创建、修改、删除等操作逻辑;深入数据增删改查的可视化与 SQL 语句双重操作模式,结合Excel/SQL文件的导入导出场景提供实操指南。同时覆盖数据备份恢复、跨库同步等进阶功能,以及视图、存储过程等高级应用。通过对比同类工具突出Navicat的易用性与功能性优势,并针对连接失败、字符乱码等常见问题提供解决方案,帮助读者从零基础掌握数据库全生命周期管理,提升数据操作效率与安全性。

邓邓子的博客 1897

java嵌套事务,嵌套事务 - 回滚方案

A(){con.begin;..................B();................(con.rollback;)con.commit;}B{con.begin;..............con.commit;}In the above code, I begin a new DB transaction at A(). It executes some transactio...

weixin_36460310的博客 479

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

嵌套事务的内层事务方法被try catch捕获,但是依然导致外部事务的回滚问题

导致这个问题的重点是需要李姐 嵌套事务中的事务默认传播特性 ,方法A 执行的所有数据全部回滚,我们可以知道,是 方法A 上标识的 @Transactional 准备别事务管理器切面检测到了,才会导致 方法A 事务全部回滚。 可是报错明明在 方法B ,为什么会导致 方法A 的事务回滚呢?我们都知道,@Transactional 事务的默认传播机制是 Propagation.REQUIRED,即:若有事务,则复用,没有则创建一个。 所以 方法A 和 方法B 事务是同一个事务,在 方法B 执行的异常在catch住

notfound4043的博客 1060

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Bug 编年史:电商项目里那刻骨铭心的事务嵌套 Bug

在程序的浩瀚宇宙中,`Bug` 如同隐匿于星云深处的**黑洞**,看似悄无声息,却蕴含着足以扭曲和吞噬一切的力量。每一位程序员,无论资历深浅,都在与 `Bug` 的持续斗争中砥砺前行,书写着属于自己的传奇与教训。 我仍清晰地记得初入编程世界时的那份懵懂与好奇,怀揣着对创造神奇软件的憧憬,一头扎进了代码的海洋。那时,每一行代码的敲击都仿佛是在编织梦想的丝线,然而,`Bug` 这个不速之客很快就打破了这份宁静与美好。从简单的语法错误导致程序无法编译,到逻辑漏洞使得运行结果南辕北辙,这些早期的 `Bug` 就像

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 1270

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

PHP事务处理:程序员生死簿,你敢忽略吗?

说到PHP事务处理,这东西简直就是程序员的“生死簿”。你要是处理得好,数据一致性稳稳的;处理得不好,轻则数据错乱,重则系统瘫痪。今天就来聊聊我在项目中用PHP处理事务的那些事,顺便把坑都给你踩一遍。你得知道什么是事务。简单来说,事务就是一组SQL操作,要么全部成功,要么全部失败。

HMdBmqqj的博客 789

分布式事务管理器(MSDTC)的事务处理异常的排错

http://www.cnblogs.com/joejoe/archive/2012/08/10/2631204.html 这两天,因为一台MS SQL2005服务器的系统有些问题,重启后不能正常登录系统,采取了恢复上次正确配置的方式登录。原来一直运行无问题的程序,在添加新记录的时候,出现事务错误。而在编辑,删除等均正常。 我的网络环境是一台是Web服务器,一台是数据服务器,同一机房,相...

weixin_34062469的博客 876

2021-01-22 - Django事务、delete、多数据库

背景 Django 3.1.5 Django配置:默认配置 多数据库 default: default_db 表:user表 another_db: another_db 表:another表 尝试delete和更新数据 代码 问题:delete未回滚且生效,user回滚。 代码内容: 尝试delete another_db.another表中的数据 且更新 user表中的enable字段 def delete_anchor(id): user = User.obje

jaylixueji的博客 513

DB2 表锁问题浮现及解决

问题查看: DB2监控,发现出现了很多Lock Waiting状态的Application,并且5790Locked By 5831这时,首先想到的是事务嵌套了,内部事务未提交导致外部事务无法提交,导致表锁。 查看代码中确实存在事务嵌套的问题,当删除外部没有必要的事务后,此问题解决 备注:清除当前表的锁占用 db2 force application all #清除所有锁占用 db2 force application 5831 #清除当前应用的所占用 ...

donkeyboy001的博客 591

事务嵌套问题_事务嵌套的解决之道

前言我们在开发一个复杂的系统时可能经常出现这样的场景:比如,A函数中调用了B函数,而A函数和B函数同时都使用了事务,这样就出现了事务嵌套。在MySQL的官方文档中有明确的说明MySQL是不支持嵌套事务的:Transactions cannot be nested. This is a consequence of the implicit commit performed for any curr...

weixin_39883374的博客 2436

java 事务嵌套_Java事务以及嵌套事务

最近遇到事务的处理,嵌套事务,自己研究,整理一下。1 先看结论1、在Java事务中,事务的嵌套,如果有事务成功,那么则都成功,否则都不会成功。2、如果事务中存在异常,只要对异常进行捕获和处理,都为执行成功,否则都不会执行成功。2 Propagation取值REQUIRED(默认值):在有transaction状态下执行;如当前没有transaction,则创建新的transaction;SUPPO...

weixin_39633171的博客 3211

Spring事务嵌套机制

Spring 事务机制回顾 Spring事务一个被讹传很广说法是:一个事务方法不应该调用另一个事务方法,否则将产生两个事务.结果造成开发人员在设计事务方法时束手束脚,生怕一不小心就踩到地雷。 其实这是不认识Spring事务传播机制而造成的误解,Spring对事务控制的支持统一在TransactionDefinition类中描述,该类有以下几个重要的接口方法: int ge...

sun82111的专栏 1万+
上一篇: 事务服务浅析
下一篇: 软件开发的基础知识—软件版本号详解
java008
博客等级 码龄23年 6粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值