使用 DependentTransaction 管理并发

@TransactionalEventListener 事务事件监听进行业务解耦 阅读详情

转自:https://msdn.microsoft.com/zh-cn/library/ms229976(v=VS.90).aspx

Transaction 对象是使用 DependentClone 方法创建的。该对象的唯一目的是保证当某他一些代码段(如辅助线程)还在事务上工作时,不能提交事务。当在克隆的事务中执行的工作最终完成并可以提交时,该对象可以使用 Complete 方法通知事务的创建者。因而您就可以保持数据的一致性和正确性。

此外,DependentTransaction 类还可用于管理异步任务之间的并发性。在这种情况下,当依赖的克隆执行其自己的任务时,父事务可以继续执行任意代码。换句话说,直到依赖的克隆完成时,父事务的执行才会被阻止。

创建依赖的克隆

若要创建依赖的事务,请调用 DependentClone 方法并将 DependentCloneOption 枚举作为参数传递。此参数定义在依赖的克隆指示可以提交事务(通过调用 Complete 方法)之前,对父事务调用 Commit 时的事务行为。下面列出了此参数的有效值:

  • BlockCommitUntilComplete 会创建一个依赖的事务,后者在父事务超时或对所有依赖事务调用 Complete 以指示完成之前一直阻止父事务的提交进程。当客户端希望在依赖事务完成后再提交父事务时,这一点十分有用。如果父事务的工作比该依赖事务早完成,并在此时对该依赖事务调用了 Commit,则提交进程会被阻止(在该状态下可在依赖事务上执行其他工作并可创建新登记),直到所有依赖事务都调用 Complete 为止。只要所有依赖事务完成了工作并调用了 Complete,就会立即启动事务的提交进程。

  • 另一方面,在调用 Commit 之前对父事务调用 Complete 时,RollbackIfNotComplete 会创建一个自动中止的依赖事务。在这种情况下,在该依赖事务中执行的所有工作在一个事务生存期内都保持不变,并且根本无法只提交其中的一部分。

当应用程序完成在该依赖事务上的工作时,必须调用一次 Complete 方法;否则,会引发 InvalidOperationException。在执行此调用之后,不能在事务上尝试任何附加工作,否则就会引发异常。

下面的代码示例演示如何创建一个依赖事务来管理两个并发任务,具体为克隆一个依赖的事务并将其传递给辅助线程。

C#
public class WorkerThread
{
    public void DoWork(DependentTransaction dependentTransaction)
    {
        Thread thread = new Thread(ThreadMethod);
        thread.Start(dependentTransaction); 
    }

    public void ThreadMethod(object transaction) 
    { 
        DependentTransaction dependentTransaction = transaction as DependentTransaction;
        Debug.Assert(dependentTransaction != null); 
        try
        {
            using(TransactionScope ts = new TransactionScope(dependentTransaction))
            {
                /* Perform transactional work here */ 
                ts.Complete();
            }
        }
        finally
        {
            dependentTransaction.Complete(); 
             dependentTransaction.Dispose(); 
        }
    }

//Client code 
using(TransactionScope scope = new TransactionScope())
{
    Transaction currentTransaction = Transaction.Current;
    DependentTransaction dependentTransaction;    
    dependentTransaction = currentTransaction.DependentClone(DependentCloneOption.BlockCommitUntilComplete);
    WorkerThread workerThread = new WorkerThread();
    workerThread.DoWork(dependentTransaction);
    /* Do some transactional work here, then: */
    scope.Complete();
}

客户端代码创建了一个还能够设置环境事务的事务范围。不能直接将环境事务传递给辅助线程。相反,应通过对当前事务调用 DependentClone 方法来克隆当前(环境)事务,并将依赖事务传递给辅助线程。

ThreadMethod 方法将在新线程上执行。客户端会启动一个新线程,以将该依赖事务作为 ThreadMethod 参数传递。

由于依赖事务是用 BlockCommitUntilComplete 创建的,因此应保证第二个线程上的所有事务工作都完成并对该依赖事务调用 Complete 后才能提交事务。这意味着如果客户端的范围在新线程对该依赖事务调用 Complete 之前结束(客户端尝试在 using 语句结束处释放事务对象时),则客户端代码会一直被阻止,直到对该依赖事务调用 Complete为止。这样,事务就可完成提交或中止。

并发问题

使用 DependentTransaction 类时,存在其他一些需要了解的并发问题。

  • 如果辅助线程回滚事务而父事务却尝试提交它,则会引发 TransactionAbortedException。

  • 您应为事务中的每个辅助线程分别创建一个依赖的克隆。不要将同一依赖克隆传递给多个线程,因为只有一个线程能够对依赖克隆调用 Complete。

  • 如果辅助线程生成新的辅助线程,请确保利用现有的依赖克隆中再创建一个依赖的克隆,然后将后者传递给该新线程。

MySQL:Waiting for dependent transaction to commit 这是一个stage,定义在mysqld.cc文件的11321行。 mysql在sql/rpl_mts_submode.cc文件的wait_for_last_committed_trx方法中进入此stage。 #rpl_mts_submode.cc bool Mts_submode_logical_clock::wait_for_last_committed_trx( Relay_log_info *rli, longlong last_committed_arg) { THD *thd = 阅读详情

相关推荐

微信小程序网关逆向分析:从协议、签名到会话管理的安全架构剖析

在现代Web与移动应用开发中,API网关作为客户端与后端服务之间的关键通信枢纽,承担着协议转换、流量调度、安全防护与性能优化等核心职责。其工作原理通常涉及统一的请求路由、身份认证、参数校验与响应聚合。从技术价值看,深入理解网关机制不仅能帮助开发者构建更健壮、可扩展的微服务架构,还能为安全评估、性能调优与故障排查提供基础。在移动生态如微信小程序中,网关设计尤为关键,它需要处理微信特有的登录态、数据加密与防重放攻击等安全需求。本文聚焦于微信小程序网关的逆向分析方法,通过结合网络抓包与代码反编译技术,深入解析其通

weixin_29323493的博客 443

Flowable源码注释(五十七)事务监听器(上)

Flowable源码地址:https://github.com/flowable/flowable-engine Flowable-6.7.2 源码注释地址:https://github.com/solojin/flowable-6.7.2-annotated 事务监听器,包路径:org.flowable.common.engine.impl.cfg TransactionListener 事务监听器 /** * 事务监听器 * * @author Tom Baeyens */ public int

jinyangjie的博客 1023

ESP32实战:破解校园网WPA2-Enterprise认证的完整指南

本文详细介绍了如何使用ESP32开发板破解校园网WPA2-Enterprise认证的完整指南。通过硬件准备、环境搭建、核心代码实现及常见问题排查,帮助开发者解决企业级WiFi连接难题,特别适用于校园网环境下的物联网设备开发。

weixin_29194817的博客 457

@TransactionalEventListener的使用和实现原理

@TransactionalEventListener注解。

thulium_kyg的博客 4814

Python在Windows环境下驱动乐视三合一摄像头的深度图像处理实践

本文详细介绍了在Windows系统下,使用Python驱动乐视三合一摄像头进行深度图像处理的完整实践流程。从环境配置、驱动安装、OpenNI与OpenCV库的部署,到深度与彩色数据流的读取、可视化、三维点云转换以及背景移除等应用开发,为开发者提供了从零开始掌握深度摄像头编程的实战指南。

gitlab7runner的博客 233

FPGA新手避坑指南:Vivado 2020.2里配置PLL IP核,从差分时钟输入到上板实测的全流程

本文详细介绍了在Vivado 2020.2中配置PLL IP核的全流程,包括差分时钟输入、参数设置、仿真验证及上板实测。针对FPGA新手常见的配置错误和硬件连接问题,提供了实用的解决方案和调试技巧,帮助开发者快速掌握时钟管理技术。

weixin_27051161的博客 488

MySQL 主从同步延迟排查Slave_SQL_Running_State: Waiting for dependent transaction to commit

Slave_SQL_Running_State: Waiting for dependent transaction to commit

eagle89的专栏 2678

告别卡顿!用U盘给你的MacBook Pro 2015+来一次macOS Monterey的‘大扫除’式安装

每次系统升级后,老款MacBook Pro用户最常抱怨的就是"怎么比之前更卡了?"——这不是错觉。系统迭代过程中积累的缓存文件、残留配置和隐形服务,就像房间角落堆积的灰尘,拖慢了整台机器的响应速度。而通过U盘进行的macOS Monterey全新安装,本质上是一次彻底的"数字大扫除":它不仅替换系统文件,还会重建所有索引、清理磁盘碎片,甚至能解决某些玄学般的卡顿问题。对于2015款及之后的MacBook Pro用户,这种安装方式能让老设备重获新生。

weixin_28731223的博客 312

Waiting for dependent transaction to commit/Waiting for preceding transaction to commit

简介 首先说明的是这并不是多线程复制中的问题,而是一个现象,这里来解释说明这个现象。 开启多线程回放的同学如果经常执行show slave status命令的话,应该对这两个信息不陌生。 出处 开启多线程回放后,回放控制线程会根据既定的规则,进行并发回放。因此,后续事务如果不可以跟正在回放的事务并发的话,就必须要进行等待。如果开启了slave_preserve_commit_order...

sunashe的个人随笔 8367

45个经典Linux面试题(非常详细)零基础入门到精通,收藏这一篇就够了

(文件系统分配其中的一些磁盘块用来记录它自身的一些数据,如 i 节点,磁盘分布图,间接块,超级块等。$ chmod 751 file 给 file 的属主分配读、写、执行(7)的权限,给 file 的所在组分配读、执行(5)的权限,给其他用户分配执行(1)的权限。linux命令’hash’管理着一个内置的哈希表,记录了已执行过的命令的完整路径, 用该命令可以打印出你所使用过的命令以及执行的次数。创建文件:典型的如 touch,vi 也可以创建文件,其实只要向一个不存在的文件输出,都会创建文件。

小陈的博客 2072

qt使用qxlsx实现xlsx、xls表格文件快速写入和读取

新年第二篇文章,收尾一个去年计划中发表文章和实现功能。

kbq的博客 1万+

C#中ADO事务(轻型事务/分布式事务) -附:(C#远程访问linux(ubuntu)或windows的mysql数据库 )

                                                轻型事务:Transaction  SqlConnection mycon = new SqlConnection(constr); mycon.Open(); SqlCommand cmd = new SqlCommand(

3603

基于 STM32 的手持式安检金属探测器设计与实现

【代码】基于 STM32 的手持式安检金属探测器设计与实现。

weixin_42300449的博客 900

像TransactionScope一样使用DbTransaction

System.Transactions.TransactionScope为了提供一种非常方便的实现分布式事务的方式,但是在某些情况下为了阻止本地事务向分布式事务提升,我们只能通过DbTransaction进行事务控制。在进行数据库操作的时候,我们经常会遇到这样的事务场景:当某个方法单独执行的时候,它应该在一个单一的DbTransaction中执行;当多个方法一起执行的时候,它们应用共同在DbTra...

weixin_30617561的博客 87

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

.NET可逆框架设计

前段时间一直在学习和研究.NET事务处理,慢慢的我发现可以使用事务处理来实现一种可逆的系统框架。这种框架在一些IT社区似乎还没有见过,但是在我们日常开发中确实有这个需求。所以我花了点时间深入的研究了一下事务的原理和使用,实现了以事务为纽带,以资源为操作对象的可逆框架。 这里我假设您对事务有了整体的认识,也对自定义事务管理器有过了解。[王清培版权所有,转载请给出署名] (可以参考本人的:.NET

王清培的个人博客 4274

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C#事务处理(三)之Transactions事务

自.NET 2.0以来增加了System.Transactions命名空间,为.NET应用程序带来了一个新的事务编程模型。 这个名称空间提供了几个依赖的TransactionXXX类。Transaction是所有事务处理类的基类,并定义了所有事务类可以使用的属性,方法,和事件。CommittableTransaction是唯一一个支持提交的事务类。这一个类有一个Commit方法,所有其他事务类都...

qq_23018459的博客 810

visio安装包

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

.NET简谈事务、分布式事务处理

今天这篇文章我们将使用.NET C#来进行事务性编程,从浅显、简单的本地事务开始,也就是我们用的最多的ADO.NET事务处理,然后我们逐渐扩大事务处理范围,包括对分布式事务处理的使用,多线程事务处理的使用。 一、数据库事务处理 数据库事务处理我们基本都很熟悉了,begin Transaction ……end Transaction,将要进行事务性的操作包在代码段里,为了便于文章有条理的讲解下...

weixin_30639719的博客 103

.net mysql 分布式事务处理_.NET简谈事务、分布式事务处理

今天这篇文章我们将使用.NET C#来进行事务性编程,从浅显、简单的本地事务开始,也就是我们用的最多的ADO.NET事务处理,然后我们逐渐扩大事务处理范围,包括对分布式事务处理的使用,多线程事务处理的使用。一、数据库事务处理数据库事务处理我们基本都很熟悉了,begin Transaction ……end Transaction,将要进行事务性的操作包在代码段里,为了便于文章有条理的讲解下去,我还是...

weixin_42121272的博客 244

.Net并行计算支持嵌套事务的方法

问题背景 一年前,我们开始利用.Net 4.0的TPL(Task Parallel Library)并行计算技术对复杂计算的功能节点进行性能优化,这些复杂计算往往会包含大量对数据库的操作。在应用TPL时我们发现,如果每个Task都开启独立事务(RequireNew)的话,那么一切工作正常。但是,如果每个Task需要与父线程工作于同一个事务中(Required),则多线程并行计算时会经常性地抛出“其...

weixin_34390105的博客 459

谈谈分布式事务之三: System.Transactions事务详解[下篇]

在前面一篇给出的Transaction的定义中,信息的读者应该看到了一个叫做DepedentClone的方法。该方法对用于创建基于现有Transaction对 象的“依赖事务(DependentTransaction)”。不像可提交事务是一个独立的事务对象,依赖事务依附于现有的某个事务(可能是可提交事 务,也可能是依赖事务)。依赖事务可以帮助我们很容易地编写一些事务型操作,当环境事务不存的时候,可...

weixin_30493401的博客 91

记一次Mysql主从复制延迟,Waiting for dependent transaction to commit

记一次Mysql主从复制延迟,Waiting for dependent transaction to commit一、主从复制延迟现象二、主从复制延迟分析三、主从复制总结 题外话 在官方Mysql 5.6开始引入半同步和多线程复制后,一般情况我们会采用主从复制的方式来解决Mysql数据库的备份或者高可用问题,本文记录为Mysql 5.7.27主从复制采用GTID方式并且开了多线程复制后的一次延迟。 一、主从复制延迟现象 收到主从复制延迟告警 告警内容:(敏感信息做了屏蔽)

南风TaT的博客 8412

【MYSQL】主从复制延迟,Waiting for dependent transaction to commit

收到监控报警,某套Mysql5.7数据库主从延迟过高,且持续增长。经分析确认,应用负责人在手工补跑数据,提交了大事务,这种情况下不能也无法人工干预,只能静静等从库跟上来。另,主库3小时内就已经全部跑完补跑的数据,但从库却花了一整天才追上主库,mysql性能问题是值得诟病的。

zouk‘s blogs 2345

mysql主从延时处理

Slave_SQL_Running_State: Waiting for dependent transaction to commit 或 Slave_SQL_Running_State: Waiting for Slave Worker queue 或 Slave_SQL_Running_State: Waiting for Slave Workers to free pending events

lihengfang的专栏 2414
上一篇: ASP.NET 缓存技术分析
下一篇: .NET/ASP.NET Routing路由(深入解析路由系统架构原理)
wingahi
博客等级 码龄15年 15粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值