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

时间:2009-04-15 22:52:45

标签: sql-server sql-server-2005 multithreading

如果我有几个SP

SP1
SP2
some_inline_queries

如何在不中断其他线程的情况下确保它们全部运行? 是否可以从SQL Server级别执行此操作?

编辑:

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

sp1 扫描表t1以生成随机字符串,该字符串对于t1中的列c1是唯一的;

sp2 会做一些相当密集的事情;

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

2 个答案:

答案 0 :(得分:1)

如果我理解你,你想要set the transaction isolation level以SERIALIZABLE。假设MSSQL具有真正的可串行性(它可能不是;为了实现真正的可串行很少需要,往往相当昂贵),这将保证即使你同时执行许多交易,最终的结果将是相同的,以执行一个(虽然的哪个一个通常是非确定性的),等待它完成,然后执行另一个事务,依此类推。但要小心:在数据库SERIALIZABLE实现中,通常存在微妙的“错误”,无论是实际的错误还是错误,因为这些东西对于正确而言非常棘手。特别讨厌的是,一些基于MVCC的数据库(Oracle和PostgreSQL使用MVCC,我知道Postgres的名单最近讨论这些问题与他们的DBMS)并不真正实现Serializable完美,而不是去什么应该被称为快照隔离的事实 - 这给了SERIALIZABLE 99%的好处,而且性能损失最小,但是如果你达到1%则不行。

如果SERIALIZABLE不是一个选项,或者因为它没有按你想要的那样做或者出于其他原因,你可以让每个SP在进行其脏工作之前进行独占锁定。这可能会导致死锁或超时,并需要在其他地方进行其他调整,因此这是一种丑陋的选择,但它应该可以完成这项工作。

答案 1 :(得分:1)

你在交易中运行它们吗?不确定“中断”是什么意思,但假设它们在以下内容中它们是安全的:

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