更新期间锁定项目的最佳方法

时间:2012-11-16 11:35:59

标签: sql-server record-locking

我正在创建一个网站(c#/ SQL Server 2008,.net),需要允许更新一些可由用户共享的常见信息。

例如,我有2个用户和一个包含许多项目的表。就像一个审核队列。

假设它包含ID为#1,#2,#3

的行

如果用户1首先选择#1,则需要立即锁定,直到它被释放/可用。

我有几个问题,因为这对我来说是一个未知领域。

  • 在SQL中锁定此行的最佳方法是什么?
  • 无国籍,用户2如何知道用户1已声明 #1?使用“下一个可用”方法更好吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

你有一些叫做乐观锁定的东西。但是,它并没有解决你的“报告”行被锁定的问题。对于大多数情况,报告是无用的,但它可以以编程方式解决。

如果您正在制作桌面应用程序或网络应用程序,那么锁定有点'有趣',但主要是通过使用额外列(时间戳)并在一段时间内锁定行来解决。

我创建了一个项目,我报告用户一行已被锁定,我用2个字段(开始时间,结束时间)解决了这个问题,因为我想给可更新行的人提供不同的时间。

样品:

query: select a, b, c, d, start_time, end_time FROM table

Program : if ((datetime.now()-start time > 1min) or (end_time <> null))
{
update table
SET start_time = datetime.now()
set end_time = null
where A = a and B = b and C= c and D = d, and START_TIME = start_time 
--big caps is current value, small caps value from last select ( and that is OPTIMISTIC concurency).
}
else
{
messagebox.show ("You suck, cant be changed") --personal touch :-)
}

更新行时,不要忘记放置end_time。

OFC,检查时间,可以在更新范围内

编辑:我从oracle的row_scn那里得到了这个想法,所以它不是什么革命性的