SQL Server长时间运行的事务

时间:2015-12-08 07:46:28

标签: sql-server transactions read-uncommitted

我想知道如何在连接上执行begin transaction以及将一行更新/插入数据库并让此事务挂起几个小时是多么昂贵。基本上我只想为我的文档管理系统执行“序列号”预订。我的系列是非常自定义的,我希望每当用户按下“添加新文档”按钮时,下一个值将被分配到我的系列分配表中。要分配它,我会在分配表中插入一行。下一次,当新用户请求下一个值时,将使用NOLOCK提示读取,以便他将看到我的挂起插入值,以便他也知道下一个值。如果用户取消添加新文档的表单,我只需通过打开的连接执行回滚。如果连接丢失并且我处于“添加”模式,那么我将检查我分配我的系列的当前事务ID是否与当前事务ID匹配。如果没有,那么我会分配另一个。由于连接丢失,用户丢失系列没有问题。你怎么看?我觉得这是一个非常糟糕的做法,因为它与我在几年的软件开发中学到的想法相矛盾:尽可能晚地打开连接并尽快关闭它。

提前谢谢!

2 个答案:

答案 0 :(得分:0)

我会考虑使用序列。如果它们不合适,我会做类似以下的事情:

  • 有单独的交易来管理您的“系列号”。
  • 这些交易很短,只做例如: “得到下一个号码”。
  • 有一个“州”栏目,以了解是否有某些事情正在进行中。
  • 锁定整个表格以管理其内容。

避免NOLOCK。避免长时间运行的交易。

答案 1 :(得分:0)

尽量保持您的交易尽可能小,在不同的交易中获取序列号然后您可以通过这种方式开始实际流程,等待您的交易正在进行中的连接将会减少。

您还可以考虑在某些情况下使用Read Uncommitted或其他隔离级别,例如上个月的上个星期或每年的销售,其中所需的数据已经存在或者可以接受较小的mimor错误。

考虑使用正确的索引和正确排序的连接,以便缩短执行时间。