2012-03-21 49 views
0

我的问题与this question相同 - 但有一点要添加到它。我的问题是,我的网络应用程序的用户可以创建新的记录版本。记录的每个新版本都会在50个其他相关表中创建相应的“新版本”,以记录对该特定版本的个别更改。创建一个包含大约50个表的新版本在事务中运行(以在发生错误时回滚所有更改)。很多次这个过程都很慢,可以理解的是由于涉及太多“表格插入”的“冗长事务”。ASP.NET OLTP应用程序 - 创建记录的新版本

我正在寻找更好的解决方案/设计来实现这样的场景。

  1. 有没有更好的方法相同的记录的保持“版本”,特别是当它创建多个表太多重复
  2. 我不觉得设计本身是好的太多的记录越来越插入“每行版本”,但至少要解决直接的问题,“冗长的交易” - 这会导致有时延迟。可能还没有出路,但仍想问一下 - 如果我不将“版本控制”放入事务中,是否有更好的方法可以在发生错误时进行回滚(因为事务似乎阻止了其他OLTP查询 - 由于在所有主表上插入新版本)

版本控制查询现在运行约10秒,但有时会变得更糟。任何想法将不胜感激

回答

1

您是否必须实时返回“已创建”或“失败”消息?以下对您的解决方案可能也是过度的,但它确实创建了一个可扩展的解决方案。

网络服务器可以发布消息(到某种类型的队列)请求该操作。在这一点上,用户可以继续使用该网站做其他的事情。后台的Windows服务可以处理消息(超出网站的上下文),然后通过用户(通过网站内部的消息,类似于堆栈溢出通知)或通过电子邮件通知任务运行或失败。

如果你可以远离实时处理解耦,那么你可以修改你的Windows服务来扩展。你可以有一个线程池来管理请求 - 所以也许你一次只能运行5个线程来限制负载。如果遇到更多性能问题,可以向外扩展并开发一个可以拥有2个或更多处理器队列的系统(这确实会增加它自己的问题/复杂性)。

+1

谢谢保罗。但我的问题就是这样 - 一般用例行为是这样的,只要允许用户创建记录的“新版本”,他就会去更新与该特定版本相关的信息。因此,新版本应该存在于所有这些相关表格中供用户更新信息。它必须实时发生。 – Lalman 2012-03-21 09:34:41

相关问题