限制SQL Server 2005中的SELECT语句

时间:2009-03-24 14:06:29

标签: java sql-server concurrency locking

我的情况是,在执行特定任务之前,我必须检查是否在DB中设置了特定标志,如果未设置,则完成剩余的处理并设置相同的标志。现在,在来自2个不同事务的并发访问的情况下,如果第一个事务检查该标志并且未被设置,则它继续进行。同时,我想限制第二个事务检查标志,即我想限制该事务执行SELECT查询,并且它可以在第一个事务完成其处理并设置标志后执行相同的操作。

我想在数据库级别使用锁/提示来实现它。但没有提示限制SELECT查询,我不能去隔离级别限制。

4 个答案:

答案 0 :(得分:2)

您可以创建Application Lock来保护您的标志,因此如果无法获取应用程序锁定,则第二个事务将不会执行SELECT或访问该标志

答案 1 :(得分:1)

我相信SQL Server 2005通过不允许脏读来本地执行此操作。也就是说,据我所知,只要更新/插入发生在第二个用户尝试执行select以检查标志之前,db将等待提交更新/插入,然后再处理select。

如果您想要更精细的话,以下是一些可能对您有所帮助的common locks

编辑:XLOCK也可能有所帮助。并且,在事务中包装SQL也可能有所帮助。

答案 2 :(得分:0)

您可以尝试执行这两项任务的存储过程,或者作为执行不同任务(类似代理)的2个不同存储过程的入口点。

存储过程是SQL Server中的监视器,因此是用于管理并发的工件(您想要做什么)。

答案 3 :(得分:0)

您只需在SP /代码中启动一个事务,然后更新标志。这将阻止任何其他用户阅读它(除非他们正在阅读未提交的内容)。

如果他们未提交阅读,请在更新交易上设置独占锁。