在一个事务中锁定一段时间并在其他事务中释放锁定

时间:2015-08-29 06:05:47

标签: c# sql-server multithreading rowlocking

这是一个与外部设备配合使用的.Net应用程序。当某个实体(对应于表中的行)想要与设备通信时,应该锁定SQL Server表中的相应行,直到设备返回结果或SQL Server超时。

我需要:

  • 锁定表中的特定行,以便可以读取行,但无法删除或更新。
  • 锁定机制应该在一个单独的线程中运行,以便应用程序的主线程照常工作
  • 如果做出回复,则应该释放锁定
  • 如果没有收到回复,
  • 锁定应在一段时间后释放

最佳做法是什么?

有没有标准化的方法来实现这个目标?

我应该:

  • 在我的C#代码中运行一个新线程(任务)并开始一个可序列化的事务,在事务上选择所需的行并等待时间到达或取消令牌?

  • 或使用sp_getapplock和...等的某种组合?

2 个答案:

答案 0 :(得分:1)

您应该考虑以下几点:

  • Sp_getapplock不是基于行的,所以我认为它不是你可以使用的东西
  • "应用程序的主要线程照常工作。" - 但是如果你要锁定行,任何更新/删除操作都会卡住,那就像往常一样吗?
  • 一旦锁定结束,是否可以在被阻止之后立即进行所有更新?
  • 你的拦截线程也会做更新吗?
  • 如果应用程序和外部设备正在进行更新,如何确保以正确的顺序/方式处理它们?

我想说你需要设计你的应用程序才能在这种情况下正常工作,而不只是尝试将这种功能添加为插件。

标题是关于在另一笔交易中发布,但问题中没有真正解释过。

答案 1 :(得分:1)

您无法对事务或会话中的锁进行操作。这种方法不可行。

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

您使用的并行技术并不重要。使用异步ADO.NET IO的异步方法是合适的。那将是一个单独的LongRunning任务。

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