Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 跨多个HTTP请求拆分多步骤数据库事务_C#_Asp.net Mvc_Transactions_Entity Framework 4.1_Ninject - Fatal编程技术网

C# 跨多个HTTP请求拆分多步骤数据库事务

C# 跨多个HTTP请求拆分多步骤数据库事务,c#,asp.net-mvc,transactions,entity-framework-4.1,ninject,C#,Asp.net Mvc,Transactions,Entity Framework 4.1,Ninject,我过去曾在桌面客户端应用程序中使用TransactionScope回滚不完整的多步骤事务。这种方法似乎不太可能在Web应用程序中工作 如果整个过程没有完成,有谁能提出一些方法来确保跨多个页面的多个步骤回滚?(例如,他们的浏览器崩溃或中途关闭浏览器) 当然,我可以写入某种类型的临时表,然后在一个事务中将最终记录传输到实际表中,但这会带来竞争条件的风险。我想开始一个事务,提供几个页面,每个页面将事务的一部分写入表中,然后通过提交完成事务,如果事务未完成,则在会话结束时回滚 还是我的想法不对?建议 由

我过去曾在桌面客户端应用程序中使用TransactionScope回滚不完整的多步骤事务。这种方法似乎不太可能在Web应用程序中工作

如果整个过程没有完成,有谁能提出一些方法来确保跨多个页面的多个步骤回滚?(例如,他们的浏览器崩溃或中途关闭浏览器)

当然,我可以写入某种类型的临时表,然后在一个事务中将最终记录传输到实际表中,但这会带来竞争条件的风险。我想开始一个事务,提供几个页面,每个页面将事务的一部分写入表中,然后通过提交完成事务,如果事务未完成,则在会话结束时回滚

还是我的想法不对?建议


由于我使用的是MVC 3、EF 4.1和Ninject,我不确定这会对解决方案产生什么影响,但我想我应该包括这些信息。

您可以考虑设置nservicebus或masstransit,并使用他们的saga设备

在多个页面中没有数据库事务/
TransactionScope
。即使试图做那样的事也大错特错

解决此问题有两种选择:

  • 使用
    会话

    仅当用户完成所有步骤并确认保存后,才将数据存储在会话中并将其持久化到数据库中。这绝对是您所需要的。]

  • < P>使用工作流基础和长时间运行事务。 长时间运行的事务不是数据库事务-它们是一个完全自定义的解决方案,您必须手动实现补偿(长时间运行事务的回滚)。您仍然必须以某种方式检测您的工作流是否应该得到补偿,但这对于您的解决方案来说并不是必需的。它适用于需要多个会话的“事务”的解决方案


服务总线似乎是多余的,因为我还使用了一个提供服务位置的IoC。@Mystere这毫无意义。服务巴士与国际奥委会非常不同。Sagas将消除您的竞争条件,并允许非常明确的状态转换(消息)。不过,您可能只需要使用临时表就可以了,这意味着您必须手动处理并发性。对我来说,这似乎是一种代码味道。在web应用程序中手动处理并发是很常见的。数据库事务应该尽可能短——在最常见的情况下,只有几秒钟。您想要做的是在数据库中密集锁定几分钟=您的应用程序将执行非常糟糕的操作。