我过去曾使用TransactionScope与桌面客户端应用程序回滚不完整的多步骤事务。这种方法似乎不太适用于Web应用程序。
如果整个过程没有完成,有人可以建议如何确保多个页面的多个步骤可以回滚吗? (例如,他们的浏览器崩溃或在中间过程中关闭浏览器)
当然,我可以写入某种临时表,然后在一次交易中将最终记录转移到真实表中,但这会带来竞争条件的风险。我想开始一个事务,提供几个页面,每个页面将一个事务写入表中,然后用提交完成事务,如果事务没有完成,那么它将在回滚时返回会议结束。
或者我没有想到正确的方法?建议?
由于我使用的是MVC 3,EF 4.1和Ninject,我不确定这会如何影响解决方案,但我认为我会包含这些信息。
答案 0 :(得分:8)
多个页面之间没有数据库事务/ TransactionScope
。即使尝试做这样的事情也是非常错误的。
您有两种方法可以解决问题:
使用Session
将数据存储在会话中,并仅在用户完成所有步骤时将其保留到数据库,并确认保存。这绝对是你需要的。]
使用工作流基础和长时间运行的事务。
长时间运行的事务不是数据库事务 - 它们是一个完全自定义的解决方案,您必须手动实现补偿(长时间运行的事务回滚)。您仍然必须以某种方式检测您的工作流程应该得到补偿,但这对您的解决方案来说不是必需的。它适用于需要多个会话的“事务”的解决方案。
答案 1 :(得分:1)
您可能会考虑设置nservicebus或masstransit并使用他们的传奇设施。