=================================版权声明=================================
版权声明:原创文章 禁止转载
请通过右侧公告中的“联系邮箱(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
http://www.admin85.com/
http://www.3fwork.com/
技术博客-最新最全的技术疑难解决博客
好库文摘 - 技术改变世界
红黑联盟:十三年IT技术门户 精英梦想由此起航 (网络安全,黑客防御,信息安全,编程,系统,网络)
以上都是侵犯我版权的爬虫网站。
=======================================================================
本系列已完成:
设计事务的基本结构:C++基础——模拟事务 (1)COMMAND模式
使事务支持嵌套:C++基础——模拟事务 (2)COMPOSITE模式
使事务支持保存点:C++基础——模拟事务 (3)CHAIN OF RESPONSIBILITY模式
=======================================================================
(友情支持请扫描这个)
微信扫描上方二维码捐赠