我正在与团队中的开发人员同事争论。
问题:SQL查询X在测试系统上运行1秒钟,但在实时系统上运行时间不明(150个用户可以同时运行查询)。 该查询导致8个表上的锁,其中7个表是无用的。 他的想法是在7个表上放置一个WITH(NOLOCK),这样就没有锁了。
我的论点:
我的建议是,有了nolock,用户1有可能运行需要10秒才能完成的选择查询,因为此时服务器性能较低,而用户2更改了7个表中的一个表中的值,例如:一个客户。 然后查询将完全错误或者可能无法填充预期的数据集并且它崩溃并抛出错误。所以使用Rowlock。
他的论点:
我们不需要行锁,获得这种情况的可能性太低。我们不需要完美。做什么被问到你,不要思考。
对于那些不依赖完美主义的人来说,我能说什么呢?
答案 0 :(得分:4)
我相信,根据你的说法,你的推理是正确的。
如果有可能出现问题,无论操作中导致数据库失去完整性的机会有多小,都必须修复。
诚信是数据库设计的基本前提之一,你的同事听起来他的工作并不严谨。
如果您正在尝试构建技术论证以“击败”您的同事,请注意它可能无法为您提供您想象的预期结果。
如果你的同事不能接受你所说的话,如果你真的确定你的理由是正确的,那么我会告诉你的团队领导你为什么认为这很重要并向他展示你的解决方案。如果他同意你的同事,因为他认为数据库的完整性并不重要,那么也许你应该考虑在其他地方工作。
不要误会我的意思,我意识到在现实世界中软件不能“完美”,否则它永远不会被释放。但是,不应该跳过像数据输入检查那样基本的东西,这并不难做到。它基本上与说“好吧让我们懒得验证用户输入”一样。这是你在第一年的计算机科学课上学习如何做到的事情!
我们这个星球上有足够糟糕的软件,这是我们能够惊人的时代。软件工程中的邋is不再有位置,我希望你不要让你的同事降低你的标准。保持你的标准高,你将学到更多的知识,并且从长远来看最终会做得更好。
答案 1 :(得分:1)
在SQL Server 2000(SS2k)中锁定提示非常有用,因为SS2k对于锁定UPDATE语句非常贪婪,并且默认为TABLELOCK并在进展时将其缩小。如果您知道UPDATE语句的模式,则可以使用锁定提示来提高性能,如果需要,SS2k会升级锁定。
NOLOCK是针对锁定数据的脏读取而引入的。如果频繁更新表并且不依赖于基础数据有效性的查询被阻止,则可以使用NOLOCK以其所处的状态读取数据。如果需要读取记录以生成搜索结果页面,您可以选择指定NOLOCK提示,以确保您的查询不被任何更新语句阻止。
我相信在SQL Server 2005中重新设计了锁升级,并且不再遵守锁定提示。
答案 2 :(得分:0)
如果你使用的是SQL Server,听起来就像你那样,你不必担心使用NOLOCK来阻止编写者的读者(高使用率SQL Server数据库执行大量读写操作的常见问题)你应该考虑使用{ {3}}。这适用于SQL Server 2005及更高版本。
这使得SQL Server的工作更像Oracle,并消除了读者阻止编写者所造成的问题。在您决定使用它之前,请先阅读其中的缺点。
答案 3 :(得分:0)
ACID:
- 原子性,一致性,隔离性和持久性。这些是您在危险中忽略的数据库的基本原则。
你的同事所说的是,可以忽略隔离,这是你无法看到半完成交易的财产。 某些情况下没关系。
例如,我们有一组报告不用于关键业务目的,而只是用于指示系统的一般健康状况。为此,95%的准确度足够好,我们不希望报告妨碍实际工作。
但是,对于从银行到其中一个客户的声明,100%是绝对最低准确度。在您依赖数据的情况下,必须遵守隔离。
您需要确定特定系统属于哪个存储桶。我愿意打赌,你可以忽略任何 ACID原则的情况很少。
答案 4 :(得分:0)
根据我的经验,Murphy's law是真的:如果出现任何问题, 。
我们不需要完美不是一个论点。你和你的同事肯定有要求遵守。
答案 5 :(得分:0)
“做你想做什么,不做 认为“。
请记住,你总是负责你自己的代码的人,如果出现问题,你不能说“他告诉我要做到这一点bla bla bla”...
你的同事是错的,你总是要思考,他们付钱给你使用你的大脑,你不是健美操教师(只是一个笑话,对所有热爱编程的健美操教练抱歉)。