在一个事务中锁定一行一段时间并在另一个事务中释放锁定
Lock a row for a while in one transaction and release lock in other transaction
它是一个与外部设备一起工作的 .Net 应用程序。当某个实体(对应于table中的行)想要与设备通信时,SQL服务器中的对应行table应该被锁定,直到设备return a结果或 SQL 服务器超时。
我需要:
- 锁定 table 中的特定行,以便可以读取该行,但无法删除或更新。
- 锁定机制应该运行在一个单独的线程中,以便应用程序的主线程照常工作
- 如果有响应就应该释放锁
- 如果没有收到响应,应该在一段时间后释放锁
最佳做法是什么?
有什么标准化的方法可以做到这一点吗?
我应该:
运行 我的 C# 代码中的一个新线程(任务)并开始一个可序列化的事务,select 事务上所需的行并等待时间到或取消令牌是收到了吗?
或使用 sp_getapplock
和...等的某种组合?
以下是您应该考虑的几点:
- Sp_getapplock 不是基于行的,所以我认为这不是您可以使用的东西
- "application's main thread works as usual." -- 但是如果你锁定行,任何更新/删除操作都会卡住,那么它是否照常工作?
- 一旦锁定结束,是否可以在被阻止之后立即进行所有更新?
- 您的阻塞线程也会进行更新吗?
- 如果应用程序和外部设备正在进行更新,如何确保以正确的顺序/方式处理它们?
我会说您需要设计您的应用程序以在这种情况下正常工作,而不仅仅是尝试将这种功能添加为 add-on。
标题说的是在另一笔交易中释放,但问题中并没有真正解释。
您不能跨事务或跨会话操作锁。这种做法是行不通的。
您需要 运行 一个 事务并在您希望锁持续的时间内保持打开状态。
您使用哪种并行技术并不重要。带有 async ADO.NET IO 的异步方法是合适的。所以将是一个单独的 LongRunning
任务。
您可能需要将 CancellationToken
传递给事务代码,以便在发出信号时关闭事务。这样你就可以实现任意关闭条件而不会使事务代码混乱。
它是一个与外部设备一起工作的 .Net 应用程序。当某个实体(对应于table中的行)想要与设备通信时,SQL服务器中的对应行table应该被锁定,直到设备return a结果或 SQL 服务器超时。
我需要:
- 锁定 table 中的特定行,以便可以读取该行,但无法删除或更新。
- 锁定机制应该运行在一个单独的线程中,以便应用程序的主线程照常工作
- 如果有响应就应该释放锁
- 如果没有收到响应,应该在一段时间后释放锁
最佳做法是什么?
有什么标准化的方法可以做到这一点吗?
我应该:
运行 我的 C# 代码中的一个新线程(任务)并开始一个可序列化的事务,select 事务上所需的行并等待时间到或取消令牌是收到了吗?
或使用
sp_getapplock
和...等的某种组合?
以下是您应该考虑的几点:
- Sp_getapplock 不是基于行的,所以我认为这不是您可以使用的东西
- "application's main thread works as usual." -- 但是如果你锁定行,任何更新/删除操作都会卡住,那么它是否照常工作?
- 一旦锁定结束,是否可以在被阻止之后立即进行所有更新?
- 您的阻塞线程也会进行更新吗?
- 如果应用程序和外部设备正在进行更新,如何确保以正确的顺序/方式处理它们?
我会说您需要设计您的应用程序以在这种情况下正常工作,而不仅仅是尝试将这种功能添加为 add-on。
标题说的是在另一笔交易中释放,但问题中并没有真正解释。
您不能跨事务或跨会话操作锁。这种做法是行不通的。
您需要 运行 一个 事务并在您希望锁持续的时间内保持打开状态。
您使用哪种并行技术并不重要。带有 async ADO.NET IO 的异步方法是合适的。所以将是一个单独的 LongRunning
任务。
您可能需要将 CancellationToken
传递给事务代码,以便在发出信号时关闭事务。这样你就可以实现任意关闭条件而不会使事务代码混乱。