【问题标题】:SQL Server Table locking within a store procedure without using a transaction存储过程中的 SQL Server 表锁定而不使用事务
【发布时间】:2011-02-24 09:35:50
【问题描述】:

我需要执行一个包含 3 个引用同一个表的查询的存储过程:

合并……

从表中选择 X,其中 { BLA BLA }

从表中更新 Y,其中 { BLA BLA }

存储过程应该是线程安全的,并且应该作为原子操作执行。

目前,我正在使用具有可序列化隔离级别的事务,并且在每个查询上都有 WITH (XLOCK, TABLOCK) 提示。

有没有办法在存储过程的时间跨度内维持表锁定而不使用导致性能损失的事务?

干杯, 多伦

【问题讨论】:

  • 为什么事务会导致性能损失?
  • 如果我错了,请纠正我,当使用事务时,会创建一个日志以支持回滚功能,因此存在可能会产生性能损失的开销。当然,表锁有很大的性能损失,但不幸的是我不能放弃它。我的问题是,关于表锁定约束,我可以在不使用事务的情况下锁定并保持吗?多伦

标签: sql sql-server tsql


【解决方案1】:

每当开发人员选择 TABLOCKX 或 (XLOCK, TABLOCK) 时,它就立即失去了询问性能问题的权利。

不是导致性能损失的事务。拿着锁。所以你的问题真的是:

有没有办法产生性能 没有影响的处罚 产生性能损失?

答案是否定的,没有这种方法。

【讨论】:

  • 为了保持存储过程结果的正确性,我必须在存储过程期间对相关表使用表锁。当然,这是我必须忍受的主要性能损失。手头的问题是事务具有我不需要的附加功能(回滚日志等)。
  • 所有 数据库操作在事务下进行,无论是否显式启动。没有事务“开销”,因为没有事务就不可能接触数据库。如果您不使用显式事务,则您发出的每条语句都会启动它自己的隐式事务。
【解决方案2】:

Doron,要完成你想做的事,只能使用事务来完成。我不明白你为什么说事务会导致性能开销,这是一个完全不真实的说法。除非您的意思是您的交易需要例如。 10 秒,在这 10 秒内其他事务被阻止。

现在我经常工作和设计必须维持每秒大约 80K 事务的数据库,这样做你会学到一些技巧。我建议你做的是退后一步,重新评估你的查询和表架构,如果这是一个高度事务性的数据库,我建议的第一个是摆脱任何外键约束,这是一个性能访问任何事务数据库。

另一件事是查看索引,您是否有正确的索引,您是否可能过度索引必须插入和更新的表?这可能会导致巨大的性能影响!

如果您无法重新构建表等,我可以建议您跳出框框思考一下,也许选择您想要的数据(不带锁)到临时表中,然后执行合并等。

如果你给我一个更具体的例子,我可以提供更多帮助。

但是现在,告诉我你能做什么和不能做什么。希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多