有没有办法在事务中锁定SELECT?如果发生SELECT,则在第一个未完成时不再执行SELECT。
谢谢!
答案 0 :(得分:2)
可能希望查看提示的Isolation Level instead
答案 1 :(得分:2)
我不确定我是否正确理解了您的问题,但是如果您想要实施比SQL Server默认更严格的锁定,那么您可以提高隔离级别或使用锁定提示。如果您首先需要选择某些内容然后根据SELECTed值执行更新,这将非常有用。为了避免来自另一个事务的幻像UPDATE(其中您之前选择的值在单独更改SELECT和UPDATE时被更改),您可以在SELECT语句上强加一个更新锁。
例如:
select * from mytable with (holdlock, xlock)
请注意,上面的SELECT语句使用更严格的更新锁定&在交易期间保持锁定。您还希望将语句包装在显式事务中,如:
begin transaction
select * from mytable with (holdlock, xlock) -- exclusive lock held for the entire transaction
-- more code here...
update mytable set col='whatever' where ...
commit transaction
当然,要注意长期交易。
答案 2 :(得分:0)
您需要SERIALIZABLE
的隔离级别:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
在这种情况下,其他SELECT
查询将阻塞,直到事务完成。默认级别通常是READ COMMITTED。
答案 3 :(得分:0)
似乎你正在寻找一种悲观的锁定策略,但没有实际锁定你的数据。查看sql server中的Application locks。
答案 4 :(得分:0)
更改隔离级别通常是您的最佳选择。
但是,如果由于某种原因这不是你的选择 - 你也可以做一个独家的表锁......
select * from MyTable with (tablockx)
在您的交易完成之前,这将阻止表上的任何其他选择。