Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 限制SQL Server 2005中的SELECT语句_Java_Sql Server_Concurrency_Locking - Fatal编程技术网

Java 限制SQL Server 2005中的SELECT语句

Java 限制SQL Server 2005中的SELECT语句,java,sql-server,concurrency,locking,Java,Sql Server,Concurrency,Locking,在执行特定任务之前,我必须检查是否在DB中设置了特定标志,如果未设置,则完成其余处理并设置相同标志。现在,如果从两个不同的事务进行并发访问,如果第一个事务检查标志并且没有设置,那么它将继续进行。同时,我想限制第二个事务检查标志,即我想限制该事务执行SELECT查询,并且在第一个事务完成处理并设置标志后,它可以执行相同的查询 我想用锁/提示在DB级别实现它。但是没有提示限制SELECT查询,我也不能使用隔离级别限制 我相信SQLServer2005是通过不允许脏读来实现这一点的。也就是说,据我所知

在执行特定任务之前,我必须检查是否在DB中设置了特定标志,如果未设置,则完成其余处理并设置相同标志。现在,如果从两个不同的事务进行并发访问,如果第一个事务检查标志并且没有设置,那么它将继续进行。同时,我想限制第二个事务检查标志,即我想限制该事务执行SELECT查询,并且在第一个事务完成处理并设置标志后,它可以执行相同的查询


我想用锁/提示在DB级别实现它。但是没有提示限制SELECT查询,我也不能使用隔离级别限制

我相信SQLServer2005是通过不允许脏读来实现这一点的。也就是说,据我所知,只要更新/插入发生在第二个用户尝试执行select以检查标志之前,db就会在处理select之前等待提交更新/插入

如果您想要更高的粒度,这里有一些可能也会对您有所帮助


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

您可以创建一个用于保护您的标志,这样第二个事务将不会执行选择或访问标志,如果它无法获取应用程序锁

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


存储过程是SQL Server中的监视器,管理并发性的工件也是监视器(您想做什么)。

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

如果他们正在读取未提交,请在更新事务上设置独占锁