我与团队中的一位开发人员同事发生了争执。
问题: SQL query X在测试系统上运行1秒,但在实时系统上运行的时间未知(150个用户可以同时运行查询)。查询导致8个表上的锁,其中7个是无用的。他的想法是在7个表上放置一个WITH (NOLOCK),这样就没有更多的锁了。
我的论点是:
我的建议是,使用nolock时,用户1有可能运行需要10秒才能完成的select查询,因为此时服务器性能较低,并且用户2更改了7个表中的一个值,例如客户。那么查询将是完全错误的,或者可能无法填充预期的数据集,并且它会崩溃并抛出错误。所以使用行锁。
他的论点是:
我们不需要行锁,出现这种情况的机会太低了。我们不需要完美。做别人要求你做的事,不要去想。
我能说什么才能战胜这些不指望完美主义的人呢?
发布于 2009-07-09 07:55:49
我相信,根据你所说的,你的推理是正确的。
如果有任何可能出错的可能性,无论操作中导致数据库失去完整性的可能性有多小,都必须进行修复。
完整性是数据库设计的基本前提之一,你的同事听起来似乎在工作中不够严谨。
如果你试图构建一个技术论点来“击败”你的同事,请注意这可能不会给你带来你想要的结果。
如果你的同事不同意你说的话,如果你真的确信你的推理是正确的,那么我会告诉你的团队领导为什么你认为这很重要,并向他展示你的解决方案。如果他同意你的同事的观点,因为他认为数据库完整性并不重要,那么也许你应该考虑在其他地方工作。
不要误会我,我意识到在现实世界中,软件不可能是“完美的”,否则它永远不会发布。但是,像数据输入检查这样基本的事情不应该被忽略,而且这并不难做到。这基本上等同于说,“好吧,让我们不必费心验证用户输入”。这是你在第一年的计算机科学课上学到的!
我们在这个星球上有足够多的垃圾软件,这是我们能够做出令人惊叹的事情的时代。软件工程中的马虎行为不再有立足之地,我希望你不要让你的同事降低你的标准。保持你的高标准,你会学到比他更多的东西,最终会做得更好。
发布于 2009-07-09 20:29:55
SQL Server2000 ( SS2k )中的锁定提示非常有用,因为SS2k对锁定UPDATE语句非常贪婪,并且会默认使用TABLELOCK,并在执行过程中缩小它的范围。如果您知道UPDATE语句的模式,就可以使用锁提示来提高性能,如果需要,SS2k会升级锁。
NOLOCK是为锁定数据的脏读引入的。如果一个表被频繁更新,并且不依赖于底层数据有效性的查询被阻塞,那么您可以使用NOLOCK来读取处于任何状态的数据。如果需要读取记录来生成搜索结果页面,则可以选择指定NOLOCK提示,以确保查询不会被任何update语句阻塞。
我相信SQL Server2005中的锁升级已被修改,并且不再尊重锁提示。
发布于 2009-07-09 08:01:49
如果您正在使用SQL Server,那么您应该考虑使用SQL Server Row Versioning transaction isolation,而不是担心使用NOLOCK来阻止读写(这是高使用率的SQL Server数据库进行大量读写操作的常见问题)。这适用于SQL Server 2005及更高版本。
这使得SQL Server的工作方式更像Oracle,并消除了读取器阻塞写入器所导致的问题。在你决定使用它之前,请先了解一下它的缺点。
https://stackoverflow.com/questions/1102414
复制相似问题