新足迹

 找回密码
 注册

精华好帖回顾

· 80年代的一次旅游 (全文完) (2012-3-16) lvr · 糖心卤蛋-21楼更新做法 (2011-4-27) bubblecry
· 3年之后的十一回目! (2022-12-20) joaquin · 2014秋之摄 —— 蓝山 秋色(iPhone4s) (2014-4-29) 路天涯
Advertisement
Advertisement
查看: 1330|回复: 12

~~~~~~如何实现类似于TransactionScope的功能??各路神仙请进~~~~~~~ [复制链接]

发表于 2011-6-6 16:00 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
事情是这样的,C# code中有一个对object list的循环,每一个object最后被存储到SQL table


现在的问题是数据的存储不是我C#代码来控制的,循环中的每一句实际上在Call一个3rd party dll的save方法进行存储。


想问一下各路神仙如果能实现transaction block在我的代码中。(也就是说只要有1个object save的时候出错,数据库被roll back)


谢谢了!!
Advertisement
Advertisement

发表于 2011-6-6 16:14 |显示全部楼层
此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
麻烦,
有1个object save的时候出错,要是这个错是connection error, time out...你怎么从C# roll back 之前的保存?

除非你保存到一个中间表,最后一个object保存好了就发送一个指令,这个指令会把中间表的结果apply过去,
没有这个指令,中间表里的数据会被忽略

[ 本帖最后由 典 于 2011-6-6 16:17 编辑 ]

评分

参与人数 1积分 +1 收起 理由
BJ-KING + 1 神仙1 (今天分不够的我明天加)

查看全部评分

发表于 2011-6-6 16:15 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你这个3rd party dll
每个都开、关一个transaction?
如果是的话就一定要在你另外的code中控制了,TransactionScope在这里应该也不适用

你可不可以更改这个3rd party dll写入的目标table?
如果可以的话,先写入temp table全部完成之后再update真正的目标table完成commit

评分

参与人数 1积分 +1 收起 理由
BJ-KING + 1 神仙2 (今天分不够的我明天加)

查看全部评分

If you let people believe that you are weak, sooner or later you’re going to have to kill them.

发表于 2011-6-6 16:23 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
典和北风大哥,你们的temp/middle table方法都需要改动那个3rd part dll的save方法,问题是那个是用foxpro写的,我不会啊

发表于 2011-6-6 16:23 |显示全部楼层
此文章由 fyang1024 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 fyang1024 所有!转贴必须注明作者、出处和本声明,并保持内容完整
C#中怎样实现两阶段提交(2 phase commit)?

评分

参与人数 1积分 +1 收起 理由
BJ-KING + 1 神仙3(今天分不够的我明天加)

查看全部评分

2010年度奖章获得者

发表于 2011-6-6 16:26 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
do you pass in datacontext to that 3rd party dll?

if no then no you can't

评分

参与人数 1积分 +1 收起 理由
BJ-KING + 1 神仙(4)

查看全部评分

Advertisement
Advertisement

2010年度奖章获得者

发表于 2011-6-6 16:30 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
what exception does that Save() throw at you?

maybe you can catch the exception and do the roll back manually.

if  that Save() talking to a proc, then you can put transaction scope inside that proc.

that's all
足迹 Reader is phenomenal. If you never used, you never lived 火速下载

发表于 2011-6-6 16:32 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
那就比较麻烦了
可以用trigger,在这个目标表格A被修改的时候,trigger修改,另一个mirror的表作为备份的表B中的对应状态数据,这个B表中还需要记录A表中的数据的最近的transaction状态
如果一旦error在你的code中被接到,则需要把B表中的相关数据update回A表中
应该可以的

原帖由 BJ-KING 于 6/6/2011 16:23 发表
典和北风大哥,你们的temp/middle table方法都需要改动那个3rd part dll的save方法,问题是那个是用foxpro写的,我不会啊
If you let people believe that you are weak, sooner or later you’re going to have to kill them.

发表于 2011-6-6 17:19 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
ado.net 有自己的transaction,可以commit/rollback, 不知道你说的那个3rd party有没有这种机制.

评分

参与人数 1积分 +1 收起 理由
BJ-KING + 1 神仙(5)

查看全部评分

发表于 2011-6-6 17:32 |显示全部楼层
此文章由 梦呓人 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 梦呓人 所有!转贴必须注明作者、出处和本声明,并保持内容完整
好吧,各位大哥,我放弃复杂的算法了,也不想改动foxpro的代码


主要不是关键的数据,如果某条出错,我就manually roll back。数据的存储是一个diffgram,我可以拿到之前的dataset,所以手动恢复也不是像让我去泡凤姐那么难

评分

参与人数 1积分 +3 收起 理由
乱码 + 3 泡凤姐对你来说真不难,你太谦虚!

查看全部评分

发表于 2011-6-9 20:10 |显示全部楼层
此文章由 jerryinau 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryinau 所有!转贴必须注明作者、出处和本声明,并保持内容完整
可以用内存数据库比如sqlite 让第三方软件存数据在内存数据库 然后再在.net里面实现真正的update

评分

参与人数 1积分 +2 收起 理由
BJ-KING + 2 不管怎样,神仙(六)!

查看全部评分

Advertisement
Advertisement

2010年度奖章获得者

发表于 2011-6-9 21:57 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 jerryinau 于 2011-6-9 20:10 发表
可以用内存数据库比如sqlite 让第三方软件存数据在内存数据库 然后再在.net里面实现真正的update


这个面临同样得问题,sqlite或sqlce里出错如何handle
足迹 Reader is phenomenal. If you never used, you never lived 火速下载

发表于 2011-6-9 22:54 |显示全部楼层
此文章由 jerryinau 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryinau 所有!转贴必须注明作者、出处和本声明,并保持内容完整
出错不用处理 只是个临时储存数据的地方 出错时第三方程序肯定会报错 但它不会rollback,这是主程序不copy数据到主数据库就好了
所以和楼主手工rollback的方式类似 只是这里用了临时数据库

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部