SQL Server 2005 - 有没有办法在事务中锁定SELECT?

时间:2009-04-29 21:21:53

标签: sql-server

有没有办法在事务中锁定SELECT?如果发生SELECT,则在第一个未完成时不再执行SELECT。

谢谢!

5 个答案:

答案 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)

在您的交易完成之前,这将阻止表上的任何其他选择。