在一个事务中锁定一行一段时间并在另一个事务中释放锁定

Lock a row for a while in one transaction and release lock in other transaction

它是一个与外部设备一起工作的 .Net 应用程序。当某个实体(对应于table中的行)想要与设备通信时,SQL服务器中的对应行table应该被锁定,直到设备return a结果或 SQL 服务器超时。

我需要:

最佳做法是什么?

有什么标准化的方法可以做到这一点吗?

我应该:

以下是您应该考虑的几点:

  • Sp_getapplock 不是基于行的,所以我认为这不是您可以使用的东西
  • "application's main thread works as usual." -- 但是如果你锁定行,任何更新/删除操作都会卡住,那么它是否照常工作?
  • 一旦锁定结束,是否可以在被阻止之后立即进行所有更新?
  • 您的阻塞线程也会进行更新吗?
  • 如果应用程序和外部设备正在进行更新,如何确保以正确的顺序/方式处理它们?

我会说您需要设计您的应用程序以在这种情况下正常工作,而不仅仅是尝试将这种功能添加为 add-on。

标题说的是在另一笔交易中释放,但问题中并没有真正解释。

您不能跨事务或跨会话操作锁。这种做法是行不通的。

您需要 运行 一个 事务并在您希望锁持续的时间内保持打开状态。

您使用哪种并行技术并不重要。带有 async ADO.NET IO 的异步方法是合适的。所以将是一个单独的 LongRunning 任务。

您可能需要将 CancellationToken 传递给事务代码,以便在发出信号时关闭事务。这样你就可以实现任意关闭条件而不会使事务代码混乱。