2011-08-12 35 views
6

过去,我使用TransactionScope和桌面客户端应用程序来回滚不完整的多步事务。这种方法似乎不太可能在Web应用程序中起作用。跨多个HTTP请求的多步数据库事务拆分

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

当然,我会写信给某种形式的临时表,然后在一个事务中的最后记录转移到真正的表,但是执行竞争条件的风险。我想开始一个事务,提供多个页面,每个页面将一部分事务写入表格,然后用一个提交完成事务,并且如果事务没有完成,那么当事务被回滚时会话结束。

或者我不是在想正确的方法?建议?由于我使用的是MVC 3,EF 4.1和Ninject,我不确定这将如何影响解决方案,但我想我会包含这些信息。

回答

8

跨几页不存在数据库事务/ TransactionScope。即使试图做这样的事情也是非常错误的。

有两个选项来解决这个问题:

  • 使用Session

    存储在会话数据,并坚持只有当用户完成所有的步骤的数据库,并确认保存。这绝对是你需要的。]

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

    长期运行的事务不是数据库事务 - 他们是,你必须手动实现(长期运行的事务回滚)补偿完全定制的解决方案。您仍然必须检测到您的工作流程应该得到补偿,但这不是您的解决方案所必需的。对于需要多个会话进行“交易”的解决方案。

+0

这意味着你必须手动处理并发。这对我来说似乎是一种代码味道。 –

+0

在Web应用程序中手动处理并发性非常普遍。数据库事务应尽可能短 - 在大多数常见情况下,小数秒。你想做什么意思数分钟数据库密集型锁定=您的应用程序将执行糟透了。 –

1

你可能会看看建立nservicebus或masstransit并使用他们的传奇故事。

+0

服务总线似乎是多余的,因为我也使用服务位置的IoC。 –

+3

@Mystere这没有任何意义。服务巴士与国际奥委会有很大不同。萨加斯将消除你的竞争条件,并允许非常明确的状态转换(消息)。但是,您可能只需使用临时表即可离开。 – Ryan