1

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

先感谢您!

4

2 回答 2

0

我会考虑使用序列。如果它们不适合,我会执行以下操作:

  • 有单独的交易来管理您的“序列号”。
  • 这些交易很短,只做例如“获取下一个号码”。
  • 有一个“状态”列来了解某事是否正在进行中。
  • 锁定整个表格以管理其内容。

避免 NOLOCK。避免长时间运行的事务。

于 2015-12-08T08:01:19.060 回答
0

尽量使您的事务保持较小,在不同的事务中获取序列号,然后您可以通过这种方式开始您的实际流程,等待您的事务处理的连接会更少。

您还可以考虑在某些情况下使用未提交读取或其他隔离级别,例如上个月的上周或年度销售,其中所需的数据已经存在或轻微的 mimor 错误是可以接受的。

考虑使用正确的索引和正确排序的连接以减少执行时间。

于 2015-12-08T08:15:10.703 回答