【问题标题】:tempdb SQL Server lockingtempdb SQL Server 锁定
【发布时间】:2009-12-07 14:27:12
【问题描述】:

我们的应用程序与客户机器上的另一个应用程序一起运行。 我们已经在避免 tempdb 中的长时间运行锁方面做出了一些努力,因为这显然会严重影响并发性。 但是,另一个应用程序会执行以下操作:


开始交易
创建#Table(...);
插入#Table(....) values(...);
operation_for_totally_six_seconds()。
提交;

由于操作需要时间,我们的应用程序在等待其他应用程序获取锁时会卡住。

现在,我希望有一种方法可以将我的应用程序与其他应用程序隔离开来,例如告诉 sql server 为我分配另一个 tempdb,但我还没有找到方法。这是可能的还是将我们的数据库安装在另一个 mssql 实例上的解决方案?

问候, 延斯·诺登布罗

【问题讨论】:

    标签: sql-server transactions locking tempdb


    【解决方案1】:

    tempdb 中的长时间运行的锁,因为 这显然会影响并发 很糟糕

    这实际上一点也不明显。仅当您和其他应用程序使用 same 锁时,长期持有的锁才重要。您发布的代码示例完全合法。首先,#temp 是一个连接特定的表​​,其他连接甚至都看不到它。但即使它是全局资源,它也属于其他应用程序,因此您没有业务获取它的锁。

    作为练习,打开一个 SSMS 查询窗口并运行:

    begin transaction;
    create table #temp (a int);
    

    然后打开第二个查询窗口并运行相同的查询。尽管创建了完全相同的#temp 表,但 QED 不会相互阻止。

    如果 tempdb 确实是一个瓶颈,您需要进行更多调查并找到发生争用的实际资源。

    【讨论】:

    • 很好的答案,如此真实。 @jens,虽然您可能会误解您的观察结果,但您可以确保您拥有多个 tempdb 文件。建议通常(但不总是)每两个 CPU 内核一个文件。
    【解决方案2】:

    一种选择是在同一台机器上的不同 sql server 实例中运行您的应用程序。这样你就有了自己的 tempdb。

    【讨论】:

    • 是的,但我的问题是,如果没有相当不舒服的每个数据库一个实例托管方案,这是否可能?
    猜你喜欢
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多