[C#TransctionScope多种形式的实现

问题描述 投票:0回答:1

我有一种情况,我需要从一个表单(Form1)向数据库插入一条记录,然后打开另一个表单(Form2),在该表单中,我必须向DB添加更多详细信息,并在返回到Form1时需要添加更多详细信息。最后,我必须从(From1)打开另一个窗体(Form3),在其中必须添加其他详细信息。

我的要求是,如果Form2或Form3中有任何故障,则应取消整个过程。因此,应以所有形式回滚到数据库的所有插入。我尝试在每种表单中使用TransactionScopeOption.Required来实现TransactionScope,但这似乎无法按我需要的方式工作。就我而言,如果Form3出现故障,则Form2中的插入不会回滚(我想是因为在每个作用域上都调用了scope.Complete())。

所需方案:

  1. 表格1打开
  2. 插入数据库中
  3. 返回表格1
  4. 表格2打开
  5. 插入同一数据库中
  6. 返回表格1
  7. 打开表格3
  8. 表格3发生故障
  9. 应在所有形式(Form1,Form2和Form3)的插入上调用回滚]
c# transactionscope
1个回答
0
投票

如果您不发布代码,则很难给出具体建议。

不过,原则上,数据库方面的要求是能够提交事务并保持选择状态以改变主意,以防万一您决定稍后回滚。不可能。

Complete()仅应调用一次。

要在表单之间提交数据,请考虑使用临时表,并在完成后在Form1中将它们拉在一起;否则,TransactionScope必须由Form1获取,在对Forms2&3的调用过程中保持不完整,并在最后调用Complete()d。

运气

PS:@ pinkfloydx33关于在表单之间维护本地容器的评论建议非常好(比DB调用性能更好,无需清除)。

© www.soinside.com 2019 - 2024. All rights reserved.