我有一个简单的表包含几列:Id, Name, Profit, IsBusy
。 IsBusy
的值为BIT
。
我需要创建一个sql脚本将选择所有不忙项(IsBusy为0)并同时将此标志设置为1.因此,另一个串行或并行查询将不会获得此条目,因为该标志为1。
可能存在一些技术来释放我的任务?感谢。
答案 0 :(得分:4)
您在处理某些特定行时要求阻止用户访问数据,应使用TRANSACTIONS和ISOLATION LEVEL进行处理。
你应该研究最严格的隔离级别,即SERIALIZABLE。
您应该将事务隔离级别更改为SERIALIZABLE,然后选择行,它将获取锁定其他可能也想要读取相同行的用户的行的排它锁。
您可以使用以下命令将事务隔离级别更改为SERIALIZABLE。
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
重要提示
请注意,这可能会导致用户被广泛阻止,并且您可能最终会遇到屏幕不断冻结的许多不满意的最终用户:)。
您还提到要选择行然后更新。
Update语句在默认隔离级别下的行上获取UPDATE LOCK(读取未提交)如果要更新行,则在提交或回滚更新之前,用户将无法访问该行。
答案 1 :(得分:2)
以下内容适用于您?
update X
set IsBusy = 1
output inserted.Id, inserted.Name
where IsBusy = 0