Camstar开发思考:如何在C代码中控制事务

Camstar开发思考:如何在C代码中控制事务目录开发现状开发问题解决方案 1 自定义 UserFunction 预调用服务预调用服务方案设计与实现代码设计实现结果开发现状 Camstar 开发过程中 业务代码通常写在以下位置 1 Web 服务端 C 代码 基于 NET 的 B S 框架 代码运行环境是 IIS 因为直接使用 VisualStudio 即可编程 并且方便和 UI 做代码交互 因此很多业务代码都在此处编

目录

开发现状

开发问题

解决方案

1)自定义UserFunction

2)预调用服务

预调用服务方案设计与实现

代码设计

实现结果


开发现状

Camstar开发过程中,业务代码通常写在以下位置:

1)Web服务端(C#代码)

基于.NET的B/S框架,代码运行环境是IIS,因为直接使用Visual Studio即可编程,并且方便和UI做代码交互,因此很多业务代码都在此处编写。

2)Designer的CLF中

由Web服务端代码调用Camstar的WCF服务触发,在designer中,CLF代码全部执行完毕后才会调用Commit方法提交事务,写入数据库,如果发生异常则会回滚全部CLF代码,因此对于事务要求较高的业务代码,通常在Designer中编写。

开发问题

但是最近遇到需求,业务代码难以在designer的CLF中编写,并且又需要对事务做把控。于是产生问题:如何在C#代码中控制整个程序的事务。

解决方案

1)自定义UserFunction

该方案的开发过程主要是先编写C#代码自定义userfunction,然后将编译好的dll注入到Camstar中,之后在designer的clf中就可以调用到该userfunction。由于代码实际上是在Camstar Service中运行,因此可以保证事务。但是这种开发方式,目前似乎没有项目这么做过,其中的难度较大,光是可以预料到的问题点就使我不想使用该方案。该方法在西门子官网有教程文档,我也没具体做过,因此本文不具体实现该方案。

2)预调用服务

研究Camstar的Event,如下图所示,Event使用了模板方法模式设计,因此可以清晰地看出整个designer程序中的代码运行生命周期(黄色闪电方法从上往下依次执行)。

Camstar开发思考:如何在C代码中控制事务

执行到AfterCommit的时候,已经提交到数据库了。那么如果能把Commit代码的触发交给C#代码中控制,那么既可做到由C#代码控制整个程序的事务提交。模板方法模式+反向控制,我很自然地就想到了通过钩子方法来实现。(模板方法模式和钩子方法可以参考我以前的博文:模板方法模式学习总结)

预调用服务方案设计与实现

文章中我不方便把具体代码之类的都传上来(我博客中一直是不上传具体产品代码的),设计思路和结果都有了,我相信懂的人自然知道怎么代码该怎么写。

代码设计

关键思路是如何在代码执行提交时停止/中断。由C#代码发出提交命令。

我采用的方法是中断,中断的方法是在Commit代码之前通过异常的方式强行中断(应该还有其他更恰当的方式)。

Service基类定义勾子变量 xxxInterrupt,bool类型,用于反向控制是否中断。

在Commit之前写入CLF代码,if(xxxInterrupt) throw;  。将执行结果一并抛出。

C#代码中,由于bool默认值为false,因此对原有代码无影响。如果需要中断,则传入参数Service.xxxInterrupt = true;

实现结果

自定义一个Lot创建界面,定义俩个按钮PreCommit和RealCommit分别代表预提交(不提交到数据库)和真实提交(提交到数据库)。页面定义一个文本框显示执行结果(方便测试),整体页面如下图1所示。

(图1)

Camstar开发思考:如何在C代码中控制事务

服务端调用Lot创建接口,根据给定的流水号规则创建Lot。由于流水号创建不重复,如果PreCommit和RealCommit都执行完成后,系统只真实往数据库提交一次修改,则说明该方案实现成功。

操作1:点击PreCommit,操作结果中显示未提交一笔数据。

操作截图:

(图2,第一次点击,预提交PEP,执行完后查数据库无新数据)

Camstar开发思考:如何在C代码中控制事务

操作2:点击3次RealCommit,操作结果中显示成功3笔数据,其中第一笔为操作1中的数据。

(图3,第一次点击,提交PEP)

Camstar开发思考:如何在C代码中控制事务

 (图4,第二次点击,提交PEP,直接写数据库) Camstar开发思考:如何在C代码中控制事务

 (第三次点击,提交PEP,直接写数据库)

Camstar开发思考:如何在C代码中控制事务

如果只点击PreCommit,不点击RealCommit,最终数据库未插入任何数据,方案实现成功。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218422.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午7:17
下一篇 2026年3月18日 上午7:18


相关推荐

  • 选择排序(C语言实现)

    选择排序(C语言实现)选择排序(C语言实现)实现原理:给出一组数据,第1轮在待排序记录r[1]-r[n]中选出最小的记录,将它与r[1]交换;第2轮在待排序记录r[2]-r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。代码初始序列:{49276597761238}第1趟:12与49交换:12{276597764938}第2趟:27不动:1227{6597764938}

    2022年6月25日
    29
  • navicat15激活码免费【在线注册码/序列号/破解码】

    navicat15激活码免费【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    67
  • java 打印数组内容

    java 打印数组内容对于java打印数组内容,暂时总结若干方法如:

    2022年6月6日
    32
  • sql server 连接查询_连表查询语句

    sql server 连接查询_连表查询语句SQL的连表查询2017年08月31日15:58:49阅读数:176SQL的连表查询连接查询包括合并、内连接、外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要。只有真正了解它们之间的区别,才能正确使用。1、UnionUNION操作符用于合并两个或多个SELECT语句的结果集。UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派…

    2025年11月15日
    5
  • NoSQL数据库介绍

    NoSQL在2010年风生水起,大大小小的Web站点在追求高性能高可靠性方面,不由自主都选择了NoSQL技术作为优先考虑的方面。今年伊始,InfoQ中文站有幸邀请到凤凰网的孙立先生,为大家分享他之于N

    2021年12月26日
    60
  • 文本分类常用算法比较

    文本分类常用算法比较本文对文本分类中的常用算法进行了小结,比较它们之间的优劣,为算法的选择提供依据。 一、决策树(DecisionTrees)优点: 1、决策树易于理解和解释.人们在通过解释后都有能力去理解决策树所表达的意义。 2、对于决策树,数据的准备往往是简单或者是不必要的.其他的技术往往要求先把数据一般化,比如去掉多余的或者空白的属性。 3、能够同时处理数据型和常规型属性。其他的

    2022年5月8日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号