关于TransactionScope和存储过程的问题

flyye_cs 2007-05-17 09:23:44
在记录网站财务流通日志时,会出现下面的情况:

表A记录操作流水记录,表B更新用户统计状态:
首先insert A,然后update B,之间出现任何问题,必须回滚以确保数据正确性。
于是用到事务来管理:
using (TransactionScope t = new TransactionScope())
{
...
inerst A;
...
update B;
...
t.Complete();
}

现有一个问题,在 update B中,是采用的存储过程,如下:
UPDATE
B
SET
.....
WHERE [ID] = @ID
IF @@ERROR != 0 OR @@ROWCOUNT = 0 --(*)
SET @ID = -1
最后返回@ID参数作为output。

如果update B出现问题,上面的事务是否会继续走完,关键是加(*)这一句,它是继续往下执行SQL操作,还是通知事务发生了错误,中断当前操作,这点不清楚。如果SQL语句继续往下走,可能导致insert A成功,update B失败,但没有回滚操作...

---------------------------

欢迎探讨跟事务相关的内容 :)
...全文
502 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyye_cs 2007-05-18
  • 打赏
  • 举报
回复
继续等待, 人气呢??
flyye_cs 2007-05-17
  • 打赏
  • 举报
回复
如果答案是1的话,就不会考虑output的值了,事务会自动回滚

如果答案是2的话,需要手动判断output的值来手动rollback

答案到底会是哪个呢?
szsheng 2007-05-17
  • 打赏
  • 举报
回复
如果Insert A 失败,事务不会提交,自然不会出错.
关键在后如果B失败,B中如果没有事务的话,当出错时返回-1,此时B操作失败.程序可以根据B的返回值来判断是否提交(t)事务,如果不提交,则A操作是不被执行的.
(
程序在执行到 Insert A 和 Update B时都没有实际数据的更新,只有提交事务时,才会向数据库提交执行.
)
zhaozhao110 2007-05-17
  • 打赏
  • 举报
回复
应该会是1
flyye_cs 2007-05-17
  • 打赏
  • 举报
回复
(*) 语句这一句非常重要...
flyye_cs 2007-05-17
  • 打赏
  • 举报
回复
上面的问题有两种可能:
1. 是执行到update语句时出错,事务马上接管,不会执行 (*) 语句及其以后的内容了
2. 是执行到udpate语句时出错,事务不管,(*) 语句及其以后的内容会依次执行下去,最后出现insert A 成功,update B失败 的情况.

哪种情况才是正确的答案?
flyye_cs 2007-05-17
  • 打赏
  • 举报
回复
欢迎讨论 :)
zhaozhao110 2007-05-17
  • 打赏
  • 举报
回复
存储过程报错,自然事务是会捕捉到异常的,并rollback...
zhaozhao110 2007-05-17
  • 打赏
  • 举报
回复
好多分啊.
flyye_cs 2007-05-17
  • 打赏
  • 举报
回复
如果把 update B 的SQL 操作改成只有一句话 update B set .. where [ID]= @ID,然后什么也不管,如果update B出现问题,事务是会捕捉到异常的,并rollback...
flyye_cs 2007-05-17
  • 打赏
  • 举报
回复
已经说了 通过判断output返回值可以回避这个问题,但 TransactionScope 的执行原理和存储过程的联系才是讨论的重点! 这个属探讨性的内容哈 :)
sbqcel 2007-05-17
  • 打赏
  • 举报
回复
或者根据那个output返回值判断是否该执行t.Complete();
flyye_cs 2007-05-17
  • 打赏
  • 举报
回复
所以这个贴子才写明是探讨事务相关方面的内容...
flyye_cs 2007-05-17
  • 打赏
  • 举报
回复
是应该这样判断的,没错。但我主要是想知道 TransactionScope 的执行原理, 这个问题可以回避,但要知道问题的原因!
sbqcel 2007-05-17
  • 打赏
  • 举报
回复
update B出现问题,你在程序里是可以获取output返回值进行判断的,错了抛出个异常,这样TransactionScope 就会回滚了
flyye_cs 2007-05-17
  • 打赏
  • 举报
回复
我主要是想知道,TransactionScope 在执行数据库操作的流程中,到底做了什么? 执行数据库操作(如执行了一个存储过程或普通SQL操作),产生的错误,TransactionScope会不会捕获到,还是按条件捕获后才Rollback...
flyye_cs 2007-05-17
  • 打赏
  • 举报
回复
其实进入update B操作时,事务已经将表B Lock, 上面的情况只是理论上存在,但要做实际的测试用例,比较难整哈。。。
北京的雾霾天 2007-05-17
  • 打赏
  • 举报
回复
在SqlServer的存储过程中如果出错了,SQL语句是继续往下走的,你可以通过检查@@error来决定程序的流向,比如:

IF (@@error <> 0) goto err
...
err:
...
weizhuangzhi 2007-05-17
  • 打赏
  • 举报
回复
测试一下不就知道了,我想应该不会回滚,因为你的存储过程这样写就是允许存储过程有错误。
当然这也是主观推断,你还要实际测试才知道。
flyye_cs 2007-05-17
  • 打赏
  • 举报
回复
等待高手解答。。。

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧