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

时间:2011-08-12 03:20:55

标签: c# asp.net-mvc transactions entity-framework-4.1 ninject

我过去曾使用TransactionScope与桌面客户端应用程序回滚不完整的多步骤事务。这种方法似乎不太适用于Web应用程序。

如果整个过程没有完成,有人可以建议如何确保多个页面的多个步骤可以回滚吗? (例如,他们的浏览器崩溃或在中间过程中关闭浏览器)

当然,我可以写入某种临时表,然后在一次交易中将最终记录转移到真实表中,但这会带来竞争条件的风险。我想开始一个事务,提供几个页面,每个页面将一个事务写入表中,然后用提交完成事务,如果事务没有完成,那么它将在回滚时返回会议结束。

或者我没有想到正确的方法?建议?

由于我使用的是MVC 3,EF 4.1和Ninject,我不确定这会如何影响解决方案,但我认为我会包含这些信息。

2 个答案:

答案 0 :(得分:8)

多个页面之间没有数据库事务/ TransactionScope。即使尝试做这样的事情也是非常错误的。

您有两种方法可以解决问题:

  • 使用Session

    将数据存储在会话中,并仅在用户完成所有步骤时将其保留到数据库,并确认保存。这绝对是你需要的。]

  • 使用工作流基础和长时间运行的事务。

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

答案 1 :(得分:1)

您可能会考虑设置nservicebus或masstransit并使用他们的传奇设施。