1

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


开始事务
创建#Table(...);
插入#Table(....) 值(...);
operation_for_totally_six_seconds()。
犯罪;

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

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

问候, Jens Nordenbro

4

2 回答 2

3

tempdb 中的长时间运行锁,因为这显然会严重影响并发性

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

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

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

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

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

于 2009-12-07T16:48:28.423 回答
1

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

于 2009-12-07T14:43:16.770 回答