2010-12-14 106 views
0

我已经开发了一个应用程序与c#的窗体显示一个员工在列表视图控件的一些细节。当用户点击一行时,另一个表单将打开并显示更详细的员工记录。Sql服务器行锁

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

+4

我建议,一旦他们打算编辑的行仅获取了锁。对于所有的时间记录只看着收购锁将影响你的数据库性能。如果它被锁定,他们是否真的有必要看到记录?如果它被锁定,他们不能编辑它。 – kevpie 2010-12-14 14:04:28

回答

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; 
+0

您可以选择'with(updlock)'来锁定读取的行。只要确保你只读一行。是的,这对于并发而言是可怕的。 – Donnie 2010-12-14 17:56:44

2

优选的方法是...

你可以timestamp列添加到表,并把它比作传入更新。

如果用户试图更新数据和时间标记不同的是,提醒用户该数据已更改并刷新屏幕。

非首选的方法是...

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

这可以成为在很多方面问题的,你(乔用户锁定一行,今天是出来,简现在需要的话),但可以在某些情况下,适当的解决方案。

+0

+1首选方式:) – 2011-10-18 20:21:36