ASP.NET OLTP App - 创建新版本的记录

时间:2012-03-21 09:14:55

标签: asp.net sql-server database-design rowversion oltp

我的问题与this question相同 - 但稍微补充一点。我的问题是我的网络应用程序的用户可以创建新版本的记录。每个新版本的记录都会在50个其他相关表中创建相应的“新版本”,以记录对该特定版本的个别更改。这种涉及约50个表的新版本的创建在事务中运行(在发生错误时回滚所有更改)。很多时候这个过程很慢,可以理解的是由于涉及太多表“插入”的“冗长交易”。

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

  1. 是否有更好的方法来维护同一记录的“版本”,特别是当它在多个表中创建过多的重复项时
  2. 我觉得设计本身并不好,因为“每行版本”都插入了太多的记录,但至少会解决当前的问题,即“冗长的交易” - 这会导致延迟。可能没有办法解决,但仍想问 - 如果我不在事务中放置“版本控制”,是否有更好的方法在发生错误时回滚(因为事务似乎阻止了其他OLTP)查询 - 由于在所有主表上插入新版本)
  3. 版本控制查询现在运行大约10秒钟,但有时会变得更糟。任何想法都表示赞赏

1 个答案:

答案 0 :(得分:1)

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

Web服务器可以发布请求操作的消息(到某种队列)。此时,用户可以继续使用该站点来执行其他操作。后台的Windows服务可以处理消息(在网站的上下文之外),然后通过用户(通过网站内的消息,类似于堆栈溢出通知)或通过电子邮件通知用户任务已运行或失败。

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