Sql server行锁

时间:2010-12-14 13:37:26

标签: sql sql-server

我用c#开发了一个应用程序,其中一个表单显示了listview控件中员工的一些细节。当用户点击一行时,将打开另一个表单并显示该员工的记录,其中包含更多详细信息。

我希望它能够工作,以便用户可以看到更详细地显示员工记录的表单,该记录将被锁定,使得另一个用户在原始用户之前将无法看到该记录关闭详细信息表格。请指导我如何使用SQL Server锁设计这种类型的应用程序。

2 个答案:

答案 0 :(得分:2)

首选方式是......

您可以向表中添加时间戳列,并将其与传入更新进行比较。

如果用户尝试更新数据且时间戳不同,请提醒用户数据已更改并刷新屏幕。

非首选方式是......

将userEditing列添加到表中,并将其设置为使用该行的用户(如结帐)。从任何没有“签出”的用户隐藏此行,并在完成后将其释放。

这可能会在很多方面对你造成问题(Joe用户锁定一行,今天就出来了,Jane现在需要它),但在某些情况下可能是合适的解决方案。

答案 1 :(得分:0)

对于行锁,您可以使用:

BEGIN TRANSACTION
UPDATE someTable set SomeThing = 'new value' where someID = 1
-- this will lock 'someTable' in affected row as long as transaction alive.

-- in another connection
select * from someTable with (readpast)
-- this will skip locked rows

但请记住,这不是一种正确的实施方式。

  • 用户可能会因为丢失数据而恐慌和责备系统,甚至说这是一个错误。
  • 当你锁定一行时,请记住它会锁定,直到连接/事务超时或用户提交该行为止。
  • 没有连接池。
  • 由于远程连接,Web应用程序的想法不好。
  • 任何涉及someTable而没有with (readpast)语句的查询都必须等待。

仅在编辑行中让用户“查看”。在ASP.NET中用于缓存编辑行:

Application[string.Format("{0}.{1}", tableName, primaryKey)] = true;
相关问题