锁定 SQL Server 和 Oracle

Har*_*rry 10 oracle sql-server locking

我一直在对 MSSQL Server 和 Oracle 中的锁定/阻塞进行一些测试,我注意到一个区别:

在 Oracle 中 - 我在不发出提交或回滚的情况下对一行执行更新,在另一个会话中我可以查看底层记录,当然,我可以查看最后提交的数据,而不是尚未提交的值。

在 MSSQL Server 中 - 当我在另一个会话中执行相同的操作时,SQL Server 一直在等待正在更新的行的提交或回滚。

有人可以解释一下 MSSQL 服务器和 Oracle 之间的锁定机制。

Lea*_*min 9

这是 SQL Server 的默认行为,要了解更多信息,您需要调用隔离级别。您上面描述的属于称为“已提交读”的隔离级别。如果你想在 SQL server 中像 Oracle 那样有类似的行为,那么你需要打开 Read Committed Snapshot 数据库选项,基本上这个选项在修改之前对你的数据进行快照并将它们放在 tempdb 中,因此你会看到最后提交的记录是快照最后提交的记录。在这种情况下,另一个隔离级别 Read Uncommitted 将返回数据,但有一个很大的问题,即您将读取未提交的记录,并且很有可能读取脏记录。

SQL Server 中存在nolockreadpast作为锁提示的概念,用于避免锁定,但它有其自身的影响。

您可以通过此链接在 Microsoft 站点上阅读有关隔离级别的更多信息。

许多中小企业有很多关于这个主题的文章,我列出其中的一些供您参考:

  1. Brent Ozar --> https://www.brentozar.com/archive/2013/01/implementing-snapshot-or-read-committed-snapshot-isolation-in-sql-server-a-guide/

  2. 肯德拉小--> https://littlekendra.com/2016/02/18/how-to-choose-rcsi-snapshot-isolation-levels/

  3. 埃里克·达林 --> https://www.brentozar.com/archive/2018/01/heaps-deletes-optimistic-isolation-levels/

  4. 保罗·怀特 --> https://sqlperformance.com/2014/07/t-sql-queries/isolation-levels

  5. 罗伯特·谢尔顿 --> https://www.red-gate.com/simple-talk/sql/t-sql-programming/questions-about-t-sql-transaction-isolation-levels-you-were-too-shy -询问/

有一个来自 Brent Ozar(现在无法找到)的视频,他清楚地解释了您提到的 Oracle 和 SQL 服务器之间的区别。出于这个原因,Oracle 过去每核的成本比 SQL 服务器要高得多,但现在情况/场景有所不同。还要在这里添加一件事 - 在 azure 中,RCSI 是默认行为。

我希望以上有所帮助。实际上,这不是一个问题,而是一个非常重要的主题和对 SQL Server 的理解,并且很难在一个答案中涵盖它们,但是上面的链接肯定会引导您朝着正确的方向前进。

  • 添加“READ_COMMITTED_SNAPSHOT”在 Azure SQL 数据库中默认处于启用状态。本地 SQL 版本中的默认行为(锁定而不是行版本控制)是为了向后兼容,恕我直言。 (4认同)
  • 产品的许可模式和成本是纯商业决定,与技术实施无关。 (2认同)