我需要执行一个存储过程,其中包含3个引用同一表的查询:
合并…
从表中选择X,其中{ BLA BLA }
从表中的{ BLA BLA }更新Y
存储过程应该是线程安全的,并且应该作为原子操作执行。
目前,我在每个查询上使用一个具有可序列化隔离级别的事务和一个with ( XLOCK,TABLOCK )提示。
有没有一种方法可以在存储过程的时间跨度内保持表锁,而不使用导致性能损失的事务?
干杯,多伦
发布于 2011-02-24 18:04:05
每当开发人员选择TABLOCKX或(XLOCK,TABLOCK)时,它立即失去了询问有关性能的问题的权利。
不是导致性能损失的事务。就是拿着锁。所以你的问题实际上是:
是否有一种方法可以在不产生性能损失的情况下产生性能损失?
答案是否定的,没有这样的方法。
发布于 2011-02-24 17:54:54
Doron,要完成你想做的事情,只能使用事务来完成。我不明白为什么你说一个事务会导致性能开销,这是一个完全不正确的说法。除非你的意思是你的事务需要例如。10秒,在这10秒内,其他事务被阻塞。
现在,我经常工作并设计每秒必须支持大约80K事务的数据库,这样做你会学到一些技巧。我建议您后退一步,重新评估您的查询和表体系结构,如果这是一个高度事务性的数据库,我建议的第一个建议是摆脱任何外键约束,这会影响任何事务性数据库的性能。
另一件事是查看索引,您是否拥有正确的索引,您是否对必须插入和更新的表进行了过度索引?这可能会造成巨大的性能影响!
也许我可以建议你,如果你不能重新架构表等,稍微跳出框框,也许选择你想要的数据(用nolock)到临时表中,然后执行你的合并等。
也许如果你给我一个更具体的例子,我可以提供更多的帮助。
但现在,告诉我你能做什么,不能做什么。希望它能帮上忙!
https://stackoverflow.com/questions/5102777
复制相似问题