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

本文关键字:事务 数据库 分割 HTTP 请求 | 更新日期: 2023-09-27 18:05:36

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

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

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

还是我想错了?建议吗?

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

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

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

你有两个选择来解决这个问题:

  • 使用Session

    仅当用户完成所有步骤并确认保存时,才将数据存储在会话中并将其持久化到数据库。

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

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

您可以考虑设置nservicebus或masstrtransit并使用它们的saga设施。