代码之家  ›  专栏  ›  技术社区  ›  Haoest

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

  •  0
  • Haoest  · 技术社区  · 16 年前

    如果我有几个SP

    SP1
    SP2
    some_inline_queries
    

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

    编辑:

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

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

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

    一些声明 将sp1返回的随机字符串插入表t1的c1中。所以,如果我同时运行这个主脚本的多个实例,我需要t1中的所有内容。当所有脚本完成运行时,c1将是不同的。

    2 回复  |  直到 16 年前
        1
  •  1
  •   IEnumerator    16 年前

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

    Begin Transaction MyTranNameHere
    exec sp1
    exec sp2
    some statement
    Commit Transaction MyTranNameHere
    
        2
  •  1
  •   kquinn    16 年前

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

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