Transaction Object在并发程序开发中的应用

Revit二次开发1、Revit事务(Transaction) Revit二次开发 1、事务(Transcation)TranscationTransactionModeTranscation的实现其它相关SubTranscationTransactionGroupRegenerationJournalingAttribute结束语 [本内容个人为学习笔记,部分文字来自网络] Transcation 在改变Revit中模型时,需要使用Transaction事务来进行处理,也就是创建、修改、删除Revit模型时,必须使用Transcation,在Transcation进行 阅读详情

  上一篇谈了对未来并发程序的一些预想,今天来谈谈如何在并发程序中运用Transaction Object实现无锁并发。

  Transaction Object这一概念来自于数据库,现在的数据库一般都能很好的支持并发访问,对于只读数据来说天生就可以被并发的访问而不需要任何同步机制,主要问题在于写入上,当对一个数据同时进行多次写入操作的时候,操作之间就会互相影响,从而产生错误结果,同样在写入过程中如果读取数据可能会导致读到错误的数据。因此,首先我们必须让写入操作串行化的进行,其次更新过程中数据的读取要保证是一致的,也就是要么是更新前的数据要么是更新后的数据,而不会读到更新过程的中间状态。最后如果更新失败,应该可以把数据还原成更新前的状态。数据库运用Transaction实现了这些原则。

  那么我们是否可以把这个概念移植到更一般化的程序中来呢?考察这样一类系统,它在同一时间里维持着一组对象,不停的保持这些对象的添加、删除、更新还有对象之间的交互。对象的更新一般来自于外部事件(例如外部输入,时间流逝等等),同时对象与对象之间也存在着互相的影响。

  现在让我们来看更新和交互这两个过程,不外乎就是读取对象状态、按照一定的逻辑规则进行计算然后把结果写回到对象里这样三个步骤,如果现在我们把最后一步写入分离出来,把它放入一个队列中以便稍后执行,这样做会有什么好处呢?因为我们不会立刻改变对象状态,所以我们能够在同一个时间发起一组对象的更新和交互的并发操作,此时读取和计算对象状态都是安全的,不需要任何同步机制,当所有的计算全部完成以后我们在一个单独的线程内串行化的把结果写回,因为此时只有写入操作,这个过程可以很快的被执行,最终完成整套更新流程。至于对象的添加和删除,因为对象是放在容器中进行管理的,如果我们把容器也当作对象同样的来处理,这个问题也可以得到一致的处理。

  这么做会造成什么后果呢?首先在一次并发的计算过程中对象状态始终不会改变,考虑极端一点的情况,如果我们永远不更新对象状态,那么系统将永远不会演化,但是如果我们只是在很小一段时间片内让对象状态只读,那么大多数系统是可以容忍这种情况;其次写入操作虽然是串行执行的,但因为是并发线程发起的,所以时序是乱的,如果写入依赖于时序那么这种方法就会失效,但是因为操作是在很小一段时间片内发起的,我们可以近似的认为这些操作是同时产生的,可以不关心时序;最后,写入操作之间可能存在冲突和互相矛盾,例如两个对象同时需要占用某个只能被独占的对象,这样会涉及到三个对象的写操作,如果不加判断就会引起冲突,对于这个问题我们可以加入一定的仲裁机制来解决;还有一种情况是两个操作同时去修改某个变量值,此时我们可以保存变量的改变量而不是变量值本身,这样最后写入的时候就可以合并两个操作了。

  可以看到,这种对象的更新过程具有一定的Transaction特征,因此我们把这类对象称为Transaction Object。

  下面我们以游戏中的物理模拟为例来看看如何运用Transaction Object。游戏中的物理模拟一般是这样一个过程:
proc physical_simulate
    foreach objects
        collision_detect object with other_objects
        simulate object deltatime
第一步,检查对象之间的碰撞(对象的交互过程),如果发生碰撞则改变对象状态
第二步,以一定间隔的时间片模拟对象的运动(对象的更新),刷新位置、速度等状态。
如此循环往复实现物理系统的持续运行。

现在我们运用Transaction Object来并行化这个计算过程。
proc object_simulate_task
    object_state_change = simulate object deltatime
    add object_state_change to object_state_list

proc object_collision_task
    object_state_change = collision_detect object with other_objects
    add object_state_change to object_state_list

proc physical_simulate
    foreach objects
        add object_collision_task to thread_pool
    wait_for thread_pool
    foreach thread
        update thread.object_state_list
    foreach objects
        add object_simulate_task to thread_pool
    wait_for thread_pool
    foreach thread
        update thread.object_state_list
    update object_state_list

  可以看到,我们将物理计算中最耗时的碰撞检测和运动模拟并行化到了线程池中并行计算,但是在碰撞检测和运动模拟的过程我们并不把计算结果立刻写回对象中,而是先放到一个队列中(注意:我们可以为每个线程单独准备一个队列,而不使用单一的队列,这样可以避免队列操作的同步化)。等到计算全部完成再将结果更新到对象中去。整个计算过程不需要任何同步锁,每个计算线程都可以顺畅的并发执行并且无需担心死锁和同步问题。

  推而广之,我们还可以把这个方案套用到游戏逻辑的计算上,在网络游戏服务器上也可以采用这样的方案实现并行化计算。

  最后我们再来看看具体到语言层面我们如何设计Transaction Object,首先我们要保证这些对象对外是完全只读的,所有的方法也必须是只读的,对于会修改对象状态的方法要返回一个状态改变对象,保存于队列中。用C++实现的话可以这样:

class Object
{
friend class ObjectStateUpdate;
protected:
    Vector3    position;
    Vector3    velocity;
    Vector3    acceleration;
    Shape    shape;
    Mass    mass;
    //...

public:
    Vector3 GetLocation() const;
    Vector3 GetVelocity() const;
    Vector3 GetAcceleration() const;

    ObjectStateUpdator* SetPosition(Vecotr3 pos)
    {
        return new ObjectStateUpdator(this, pos - position, 0, 0);
    };
    ObjectStateUpdator* SetVelocity((Vecotr3);
    ObjectStateUpdator* SetAcceleration((Vecotr3);
    ObjectStateUpdator* UpdateObject();
    //...
};

class ObjectStateUpdator
{
    Object* obj;
    Vector3 deltaPosition;
    Vector3 deltaVelocity;
    Vector3 deltaAcceleration;
public:
    ObjectStateUpdator(Object* obj_, Vector3 deltaPosition_, Vector3 deltaVelocity_, Vector3 deltaAcceleration_);
   
    void Apply()
    {
        obj->position += deltaPosition;
        obj->velocity += deltaVelocity;
        obj->acceleration += deltaAcceleration;
    }
};  

UVM component,object 之间传递接口,transaction通信方式总结 transaction会在例化的seq的body中自动产生。从testbench传递至UVM各个模块中。 阅读详情

相关推荐

ABAP开发用transaction code一览

ABAPer 常用Tcode 注意下面两点: 1使用Tcode S001后显示SAP easy access ABAP workbench能看到下面所有Tcode 2使用Tcode不当SE43看到的Area Menu实际上大都是可直接运行的Tcode(但是  不支持/n Area menu,/O Area menu等),运行这些Tcode看到的是相关Application area

New Life LAUNCHING! 920

Spring事务基础接口

spring事务三大接口: 1.TransactionStatus spring对事务封装的接口 public interface TransactionStatus extends SavepointManager, Flushable { boolean isNewTransaction(); boolean hasSavepoint(); void setRollbackOnly(); boolean isRollbackOnly(); @Override

weixin_38068301的博客 625

一文吃透 SAP Object Services 的 Transaction Mode:在经典 SAP LUW 与纯 OO 事务之间自由切换

本文探讨了SAP ABAP中持久化对象(Persistent Object)与对象服务(Object Services)的事务边界问题。文章指出,在不同场景下(传统报表、BAPI调用链、OData运行时等),事务提交时机、更新任务执行方式和锁释放行为可能存在差异。为此,SAP引入了"事务模式"(transaction mode)概念,用于明确区分经典事务和面向对象事务两种工作方式。 文章详细介绍了两种事务模式:兼容模式(允许在经典ABAP程序中使用持久化对象)和面向对象事务模式(适用于纯

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

事务的介绍与使用

业务方法A可能调用业务方法B,两个可能都加了事务注解,此时改以谁为准REQUIRED: 支持当前事务(外部事务,即调用者A),如果不存在则创建新事务. A有事务就按A的来,没有则创建一个新事物REQUIRES_NEW: 创建一个新事务,并且暂停当前事务(外部事务).NESTED: 如果当前存在事务(外部事务),则嵌套在该事务中执行(B嵌套在A中执行,但B有独立的提交和回滚),否则就会REQUIRED一样.

ShirleyZ1007的博客 556

用 ABAP Object Services 的 Transaction Service 把事务提交这件事做稳

ABAP Object Services(OS)提供了一套面向对象的持久化与事务框架,通过事务服务解决传统ABAP开发中的提交痛点。OS将数据库访问封装在持久化对象内部,通过Transaction Service显式管理事务生命周期,用START和END方法界定事务边界,并在END时隐式触发提交。关键优势包括:1)确保业务完成与数据提交的强一致性;2)避免事务边界分散导致的维护问题;3)通过finished事件机制实现可靠的提交后回调。示例展示了如何创建事务管理器、修改持久化对象属性,并通过事件监听提交结果

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

把事务边界握在手里:SAP Object Services Transaction Service 与经典 SAP LUW 的工程化实践

本文深入解析了SAP系统中事务处理的实现机制,重点对比了经典ABAP与Object Services两种事务处理方式。文章首先区分了数据库LUW与SAP LUW的概念差异,指出SAP LUW通过跨对话步骤的一致性协议确保业务完整性。随后详细介绍了经典ABAP中的两种数据打包技术:update task和ON COMMIT子例程,并分析了它们的工作原理。最后阐述了Object Services Transaction Service的创新点,它通过框架自动跟踪持久化对象变更,在保持与传统事务兼容的同时简化开发

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

Spring HibernateTransactionManager事物管理类(HibernateTransactionObject)

我们在Spring里通常把事务交给HibernateTransactionManager来处理,通过Aop配置事务,把事务交给该类之后就会由该类来帮我们管理和提供事务。这里它是怎么实现的,下面我们深入源码..... public class HibernateTransactionManager extends AbstractPlatformTransactionManager imp...

WEBCODE 426

处理图数据, 安装“Pytorch“ + 图神经网络开源框架“PyG “+ “ogb“使用

"OGB" OSError: [WinError 127] 找不到指定的程序。1.[遇到这类问题往往跟torch安装的工具包(如torch-sparse,torch-scatter,torch-cluster)版本没对应上有关](https://blog.youkuaiyun.com/weixin_42358688/article/details/117433691)2.[OGB使用环境安装与依赖](https://ogb.stanford.edu/docs/home/)Data Loaders3.[torch-geo

Fuguir™的博客 3698

数据库事务(Transaction)的四大特性和隔离级别

数据库事务(Transaction)的四大特性和隔离级别 转载:http://c.biancheng.net/view/4220.html https://zhuanlan.zhihu.com/p/76743929 mysql锁:https://zhuanlan.zhihu.com/p/29150809 https://blog.youkuaiyun.com/cug_jiang126com/artic...

Object的博客 389

松灵机器人——ROS下的CAN通讯调试(内含所需调用包,都是操作步骤)

松灵机器人——ROS下的CAN通讯调试(都是操作步骤) 1 代码包地址 scout_ros package:https://github.com/westonrobot/scout_ros.git ugv_sdk-main package:https://github.com/westonrobot/ugv_sdk webots package:https://cyberbotics.com/ 2 硬件准备 2.1 SCOUT MINI 小白车 + 尾部航空插头 + CAN_TO_USB适配器

weixin_48924581的博客 1万+

Win11大版本更新失败:系统保留分区空间不足的终极解决方案

本文针对Windows 11大版本更新时遇到的“系统保留分区空间不足”错误,提供了详细的诊断与解决方案。核心问题在于EFI系统分区(ESP)空间过小,导致更新失败。文章重点介绍了使用傲梅分区助手等第三方工具安全扩展EFI分区的完整步骤,并提供了手动清理、使用安装介质修复等替代方案,帮助用户彻底解决更新障碍,顺利完成Win11升级。

weixin_29280219的博客 953

Transaction 浅析

一。先从jdbc来说最简单的事物处理 public void test1() throws Exception{ String url=""; Class.forName("com.mysql.jdbc.Driver");//加在驱动 Connection con=DriverManager.getConnection(url); //事物开始。 con.setAutoC

qq_17641373的专栏 2648

国产大模型高考横评:数学推理与教育落地能力实测

大模型能力评估正从开放榜单转向封闭任务的确定性验证,高考作为强逻辑、低容错、高精度的标准化考试,成为检验模型真实推理能力的理想标尺。其核心在于考察知识覆盖、步骤完整性、单位敏感性与教学对齐度,而非单纯答案正确率。数学解答题尤其凸显模型在前提校验、条件枚举与过程可控性上的差异,反映出训练数据与教育语料深度耦合带来的工程化优势。该范式已延伸至语文语感建模、英语表达习惯适配及理综跨学科缝合等场景,为智能阅卷、精准答疑和教培系统集成提供可复现、可解释、可部署的技术依据。

weixin_30436581的博客 288

begin transaction/rollback transaction

http://msdn.microsoft.com/en-us/library/ms188929.aspx

snow365的专栏 2284

【YOLO】Mask Proto分支理解

Mask Proto分支通过解耦全局原型与实例参数,在保持YOLO实时性的同时实现精准分割。其技术核心在于利用多尺度特征生成可组合的原型,结合动态系数适应不同目标形态。未来可进一步融合Transformer的注意力机制,增强对复杂场景的建模能力。

浩瀚之水的专栏 476

cherry使用MCP协议Streamable HTTP实践

摘要:Streamable HTTP协议是针对传统HTTP+SSE传输方式的改进方案,解决了连接恢复、服务器资源占用和单向通信等问题。该协议基于普通HTTP实现,支持无状态服务器、纯HTTP服务和多轮对话,同时兼容现有基础设施。通过演示展示了服务端和客户端的配置方法,体现了其灵活性和实用性。MCP(多轮对话协议)作为扩展LLM能力的关键技术,代表着未来交互式AI的发展趋势。

全网120W+关注AI拉呱,专注人工智能以及科技前沿! 563

TRANSACTION_HEADER_ID & TRANSACTION_BATCH_ID & TRANSACTION_BATCH_SEQ

MTL_TRANSACTIONS_INTERFACE和MTL_MATERIAL_TRANSACTIONS_TEMP有三个类似的字段:TRANSACTION_HEADER_ID & TRANSACTION_BATCH_ID & TRANSACTION_BATCH_SEQ以下为eTRM里关于这三个字段的解释:TRANSACTION_HEADER_ID:Transaction group identif

田攀的日志 4410

SKUA-GOCAD入门教程-第六节

DisplayElements窗口是用于浏览和处理项目数据的工具,包含多个数据浏览器,如模型列表、对象、未分类对象、属性数据及资源数据。

江洋大葱的博客 983

存储过程中的pragma autonomous_transaction作用

  转自:https://blog.youkuaiyun.com/pan_tian/article/details/7675800   这段时间遇到一个问题,程序里明明插入了一条记录,但在后边的一段Procedure中却查不到刚刚插入的记录,最后发现这个Procedure的定义中加入了PRAGMA AUTONOMOUS_TRANSACTION。 PRAGMA AUTONOMOUS_TRANSACTI...

lolichan的博客 9976

万字长文解密:SAP Fiori 首屏加载缓慢背后的真相

什么是一个健康理想的 Fiori 首次加载状态?FLP 首页不臃肿,用户默认看见的内容不多但足够用缓存作业按规则运行,冷启动不至于每次都从零开始应用首屏只读必要数据,UI5 资源经过 preload,视图异步加载OData 服务字段克制、分页合理、缓存分层清楚后台 CDS 与 HANA 只为当前屏幕做最必要的工作。只要这些标准同时满足,用户第一次打开 Fiori 页面的体感通常会从明显卡顿变成可接受甚至顺滑。

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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

转:SIP 中的Dialog,call,session 和 transaction

中间响应消息 1xx 的使用则是为了节省网络开销设计的,一旦 UC 收到任何一个中间响应消息,则 UC 必须停止消息重发定时器,不再从发这个请求消息,反之则直到收到最终响应消息或重发定时器超时。事务的区分通过Via字段栈顶的Branch的值来确定,这是由于对于请求消息每经过一个有事务状态的Proxy的时候,该Proxy需要为这个事务创建一个服务器端事务和一个客户端事务,并且将自己的URI添加到Via的栈顶,并生成一个Global ID做为Branch的值,以此值来表示一个与之相对应的事务。

mingzhaoyu的博客 1676

SAP B1中文培訓教材_SDK

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

HOW TO LINK THE TRANSACTION_SOURCE_ID TO TRANSACTION_SOURCE_TYPE_ID

In this Document Goal Solution ReferencesAPPLIES TO:Oracle Inventory Management - Version 11.5.10 and laterInformation in this document applies to any platform.This document includes all versions of 1

淡 2565

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

PRAGMA AUTONOMOUS_TRANSACTION自治事务应用

<br />PRAGMA AUTONOMOUS_TRANSACTION<br />当前的存储过程作为已有事务的子事务运行,子事务的commit,rollback操作不影响父事务的状态<br />可以用于<br />(1)匿名块<br />(2)触发器<br />(3)存储过程<br /> 例子:<br />procedure addRowAutonomous ( pID in TLOG.id%type, pLDate in TLOG.ldate%type, pL

专注Oracle EBS---低调的奢华 3495

BEGIN TRANSACTION (Transact-SQL)

标记一个显式本地事务的起始点。 BEGIN TRANSACTION 使 @@TRANCOUNT 按 1 递增。   适用范围:SQL Server(SQL Server 2008 至当前版本),Azure SQL Database。  Transact-SQL 语法约定 语法

hejisan的专栏 9047

SurfaceControl之Transaction事物深入剖析-android framework实战开发

layer_state_t结构体用来代表Layer图层的的相关信息,SurfaceControl与sf的Layer共用这个layer_state_t结构体,layer_state_t包括layer所有属性主要成员如下:可以看到常见的主要属性:坐标,长宽,变换矩阵,变化值what,flags,mask等,一般是一个图层就有一个layer_state_t结构体。

learnframework的博客 5730

[Revit二次开发] 事务的应用-Transaction

项目完整代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Revit.At...

渲染引擎开发 2572
上一篇: 谈谈多核时代将带给软件业的变革
下一篇: Hybird3D DEMO
Analyst
博客等级 码龄27年 33粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值