=================================版权声明=================================

版权声明:原创文章 禁止转载 

请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我

勿用于学术性引用。

勿用于商业出版、商业印刷、商业引用以及其他商业用途。                   

 

本文不定期修正完善。

本文链接:http://www.cnblogs.com/wlsandwho/p/5162065.html

耻辱墙:http://www.cnblogs.com/wlsandwho/p/4206472.html

=======================================================================

事务工具在回滚时,遇到保存点停止回滚。(准确地讲是指定的保存点,我不打算写论文,差不多就行。:)

要想实现上述功能,必须:

0 保存点应当只是个标志,不参与也不影响实际的运算。应当把它看作成一个dummy,虽然调用了,可函数体内什么也没有。

1 保存点要能够像任务一样添加到事务中。

   他们应该有一致的接口用于添加到事务。

2 在回滚过程中,能够区别保存点和普通的任务。

   遇到保存点可能终止回滚,遇到任务还得继续执行。

3 指定的保存点被添加到一个事务中,那么指定保存点后面的任何任务不能参与回滚。

   遇到了指定的保存点,我们希望得到此时的数据,不再需要继续恢复了。

4 由于一个事务包含了一个指定保存点,所以如果这个事务被包含在另个一个事务中,那么它后面的任何任务也不能参与回滚。

   保存点可能被嵌套在多层事务里,跳出本层事务后,这个事务后的任何任务或者事务或者保存点都不因该继续回滚。

5 执行时,能够把外层事务指定的保存点信息传给内层事务,使内层事务能够判断出当前保存点是否是指定保存点。

   因为事务是可以嵌套的,指定的保存点信息可能被保存在最外的事务里,那么它应当能够传递给它的内部的事务。

我的做法:

1    引入了新类CTaskBaseEx,继承自CTaskBase。

  CTransactionBase不再从CTaskBase处,而是从CTaskBaseEx处继承。

  引入了新类CSavePointBase,它和CTransactionBase有一个共同的父类CTaskBaseEx。

 

  这样能够区别出 任务和 事务、保存点。那么就能够在遇到指定保存点时,事务能够停止当前回滚并且停止外层回滚。

 

2 CTransactionBase多了一个指向自己的关联。

 

  这样事务能够把信息传递给内存事务。责任一层层有序合理的传达。

  为什么没有画在CTaskBase或者CTaskBaseEx上?因为只有事务需要这么做,只有事务能够包含保存点,保存点不能包含事务。

 

3 由于在事务中调用的任务函数必须统一,不管是保存点、任务还是事务,都得调用Do或者Undo,所以得从返回值上想办法。还记得上一篇中我设计的枚举值吗?这里用到了。

   单纯的true和false只能表示是否正常完成,不能表示结果值是保存点完成的还是其他的什么完成的。可函数声明又必须统一,接口统一,所以只能在返回值上想想办法。

   参考COM的返回值机制,我大体也做了个能用的。

 

(还有一些,不列举了。看下图自己体会吧。)

(CTaskBaseEx还继承了一个CTagBase,后者只是存取一个内部字符串。)

简易结构图发生了很大的变化。(CTagBase我没画在简易结构图里,而是单独画了一下。主要怕干扰视线。)

=======================================================================

代码不贴。

=======================================================================

还有很多坑,有空再填吧。键盘和桌子都好凉。

=======================================================================

因为总是有爬虫网站抓取我的博客,无视我的版权,,我很伤心,所以文章最后只能这样结尾。

下面开始点名:

 

Asp.net教程_mvc4_C#_Ado.net_seo_Java_HTML CSS教程
www.tzwhx.com
www.th7.cn
解决方案网
帮客之家 | IT技术 建站编程 电脑教程 www.bkjia.com
软件开发,程序错误,exception
www.java123.net
一键重装系统_打造智能化重装系统软件
www.bitscn.com

 

设计事务的基本结构:C++基础——模拟事务 (1)COMMAND模式

使事务支持嵌套:C++基础——模拟事务 (2)COMPOSITE模式

使事务支持保存点:C++基础——模拟事务 (3)CHAIN OF RESPONSIBILITY模式

=======================================================================

(友情支持请扫描这个)

微信扫描上方二维码捐赠