Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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
Sql server 确保SQL中的线程同步是可能的吗?_Sql Server_Sql Server 2005_Multithreading - Fatal编程技术网

Sql server 确保SQL中的线程同步是可能的吗?

Sql server 确保SQL中的线程同步是可能的吗?,sql-server,sql-server-2005,multithreading,Sql Server,Sql Server 2005,Multithreading,如果我有几个SP SP1 SP2 some_inline_queries SP1 SP2 一些\u内联\u查询 我如何确保它们在没有其他线程中断的情况下同时运行? 是否可以从SQL Server级别执行此操作 编辑: 假设我们有一个包含3个主要动作的主脚本: sp1扫描表t1以生成t1中列c1唯一的随机字符串 sp2做一些相当密集的事情 some语句将sp1返回的随机字符串插入表t1的c1中。因此,如果我同时运行这个主脚本的多个实例,我需要在所有脚本运行完毕后,t1.c1中的所有内容都是不同的

如果我有几个SP

SP1 SP2 some_inline_queries SP1 SP2 一些\u内联\u查询 我如何确保它们在没有其他线程中断的情况下同时运行? 是否可以从SQL Server级别执行此操作

编辑:

假设我们有一个包含3个主要动作的主脚本:

sp1扫描表t1以生成t1中列c1唯一的随机字符串

sp2做一些相当密集的事情


some语句将sp1返回的随机字符串插入表t1的c1中。因此,如果我同时运行这个主脚本的多个实例,我需要在所有脚本运行完毕后,t1.c1中的所有内容都是不同的

您是否在事务中运行它们?不确定您所说的“中断”是什么意思,但假设它们在以下范围内,则它们是安全的:

Begin Transaction MyTranNameHere
exec sp1
exec sp2
some statement
Commit Transaction MyTranNameHere

如果我理解正确,您希望序列化。假设MSSQL具有真正的可序列化性(可能没有;真正的可序列化性很少需要,而且实现起来往往成本很高),这将保证即使您同时执行多个事务,最终结果也将与执行一个事务相同(尽管该事务通常是不确定的),等待它完成,然后执行另一个事务,依此类推。不过要小心:在数据库可序列化实现中,经常会有一些微妙的“bug”,不管它们是实际的bug还是错误的特性,因为这些东西很难正确处理。尤其令人讨厌的是,一些基于MVCC的数据库(Oracle和PostgreSQL使用MVCC,我知道Postgres列表最近正在与其DBMS讨论这些问题)并没有真正完美地实现可序列化,取而代之的是所谓的快照隔离——这提供了可序列化的99%的好处,而对性能的影响最小,但如果你只剩下1%,那就没有什么好处了


如果SERIALIZABLE不是一个选项,或者是因为它不执行您想要的操作,或者是因为其他原因,那么您可以始终让每个SP在执行脏工作之前获取一个独占锁。这可能会导致死锁或超时,并需要在其他地方进行其他调整,因此这是一种丑陋的选择,但它应该可以完成这项工作。

让我知道你的意思,也许我可以更好地回答。