我正在创建一个网站(c#/SQL Server 2008,.net),该网站需要允许更新用户可以共享的一些常见信息。
例如,我有 2 个用户和一个包含许多项目的表。很像一个审核队列。
假设它包含 ID 为 #1、#2、#3 的行
如果用户 1 首先选择 #1,则需要立即锁定,直到它被释放/可用。
我有几个问题,因为这对我来说是未知的领域。
- 在 SQL 中锁定这一行的最佳方法是什么?
- 作为无状态的,如何让用户 2 知道用户 1 声称 #1?使用“下一个可用”方法会更好吗?
提前致谢。
我正在创建一个网站(c#/SQL Server 2008,.net),该网站需要允许更新用户可以共享的一些常见信息。
例如,我有 2 个用户和一个包含许多项目的表。很像一个审核队列。
假设它包含 ID 为 #1、#2、#3 的行
如果用户 1 首先选择 #1,则需要立即锁定,直到它被释放/可用。
我有几个问题,因为这对我来说是未知的领域。
提前致谢。
你有一种叫做乐观锁定的东西。但是,它并不能解决您“报告”该行被锁定的问题。在大多数情况下,报告是无用的,但可以通过编程方式解决。
如果您正在制作桌面应用程序或 Web 应用程序,那么锁定有点“有趣”,但大多数情况下它是通过使用额外的列(时间戳)并锁定一行一段时间来解决的。
我做了一个项目,我报告用户一行被锁定,我用 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 得到了这个想法,所以这不是什么革命性的东西