我想锁定一条记录,并防止其他人对其进行更改。当我释放锁定时,其他人才可以更改该记录。
同时,当记录被锁定时,我想向用户显示一个警告,说明此记录已被锁定,不允许进行更改。
我该如何实现这个功能?
我尝试了所有的隔离级别,但是它们都不满足我的需求。有些隔离级别会等待锁定被释放,然后再进行更改。但我不希望这样做,因为在记录被锁定的时候不允许更新。
我该怎么做才能锁定记录并拒绝所有更改?
我的数据库使用的是SQL Server 2008。
我想锁定一条记录,并防止其他人对其进行更改。当我释放锁定时,其他人才可以更改该记录。
同时,当记录被锁定时,我想向用户显示一个警告,说明此记录已被锁定,不允许进行更改。
我该如何实现这个功能?
我尝试了所有的隔离级别,但是它们都不满足我的需求。有些隔离级别会等待锁定被释放,然后再进行更改。但我不希望这样做,因为在记录被锁定的时候不允许更新。
我该怎么做才能锁定记录并拒绝所有更改?
我的数据库使用的是SQL Server 2008。
假设这是MS SQL Server,您可能想要使用UPDLOCK
,可能与ROWLOCK
(表提示)结合使用。我很难找到一个描述理论的好文章,但这里是一个快速的例子:
SELECT id From mytable WITH (ROWLOCK, UPDLOCK) WHERE id = 1
SQL服务器的锁定机制只适用于保持数据完整性/防止死锁 - 事务应尽可能保持尽可能短,并且绝不能在等待用户输入时进行维护。
NOWAIT
提示执行,这将导致它在遇到锁定时立即返回,而不是等待超时。 - JustinSELECT id From mytable WITH (ROWLOCK, UPDLOCK) WHERE id = 1
,对吗? - nashSql Server有锁提示,但这些仅限于查询范围。
如果在应用程序中决定锁定记录,则可以使用与乐观锁定相同的机制,并拒绝应用程序对记录进行任何更改。
使用时间戳或GUID作为记录上的锁,并在给出错误的锁定密钥时拒绝访问或更改记录。请注意解锁记录,否则您将获得孤儿记录。
在 Stack Overflow 上查看此 重复问题。
基本上就是:
begin tran
select * from [table] with(holdlock,rowlock) where id = @id
--Here goes your stuff
commit tran
存档
可能是这样的吗?
update t
set t.IsLocked = 1
from [table] t
where t.id = @id
在更新触发器的某个地方:
if exists (
select top 1 1
from deleted d
join inserted i on i.id = d.id
where d.IsLocked = 1 and i.RowVersion <> d.RowVersion)
begin
print 'Row is locked'
rollback tran
end
您不想等待锁释放并在遇到锁时立即显示消息,如果是这种情况,那么您尝试过NOWAIT
吗?有关详细信息,请参见表提示(Transact-SQL)和SQL Server 2008表提示。要使用NOWAIT
的好处,您需要在编辑时锁定记录,请搜索以获取更多详细信息。