我已经开发了一个应用程序与c#的窗体显示一个员工在列表视图控件的一些细节。当用户点击一行时,另一个表单将打开并显示更详细的员工记录。Sql服务器行锁
我希望它能够工作,以便用户可以看到更详细地显示员工记录的表单,该记录将被锁定,以致另一个用户将无法看到该记录,直到原始记录用户关闭详细信息表单。请指导我如何使用SQL Server锁设计这种类型的应用程序。
我已经开发了一个应用程序与c#的窗体显示一个员工在列表视图控件的一些细节。当用户点击一行时,另一个表单将打开并显示更详细的员工记录。Sql服务器行锁
我希望它能够工作,以便用户可以看到更详细地显示员工记录的表单,该记录将被锁定,以致另一个用户将无法看到该记录,直到原始记录用户关闭详细信息表单。请指导我如何使用SQL Server锁设计这种类型的应用程序。
对于行锁,你可以使用:
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
但请记住,这不是实行正确的方法。
someTable
且没有with (readpast)
语句的查询都需要等待。只让用户'查看'只在编辑行。在ASP.NET缓存编辑行:
Application[string.Format("{0}.{1}", tableName, primaryKey)] = true;
您可以选择'with(updlock)'来锁定读取的行。只要确保你只读一行。是的,这对于并发而言是可怕的。 – Donnie 2010-12-14 17:56:44
优选的方法是...
你可以timestamp列添加到表,并把它比作传入更新。
如果用户试图更新数据和时间标记不同的是,提醒用户该数据已更改并刷新屏幕。
非首选的方法是...
添加userEditing列表,并将其设置为谁正在与该行(如检出)的用户。从没有“检出”的任何用户中隐藏此行,并在完成后将其释放。
这可以成为在很多方面问题的,你(乔用户锁定一行,今天是出来,简现在需要的话),但可以在某些情况下,适当的解决方案。
+1首选方式:) – 2011-10-18 20:21:36
我建议,一旦他们打算编辑的行仅获取了锁。对于所有的时间记录只看着收购锁将影响你的数据库性能。如果它被锁定,他们是否真的有必要看到记录?如果它被锁定,他们不能编辑它。 – kevpie 2010-12-14 14:04:28