Har*_*rry 10 oracle sql-server locking
我一直在对 MSSQL Server 和 Oracle 中的锁定/阻塞进行一些测试,我注意到一个区别:
在 Oracle 中 - 我在不发出提交或回滚的情况下对一行执行更新,在另一个会话中我可以查看底层记录,当然,我可以查看最后提交的数据,而不是尚未提交的值。
在 MSSQL Server 中 - 当我在另一个会话中执行相同的操作时,SQL Server 一直在等待正在更新的行的提交或回滚。
有人可以解释一下 MSSQL 服务器和 Oracle 之间的锁定机制。
这是 SQL Server 的默认行为,要了解更多信息,您需要调用隔离级别。您上面描述的属于称为“已提交读”的隔离级别。如果你想在 SQL server 中像 Oracle 那样有类似的行为,那么你需要打开 Read Committed Snapshot 数据库选项,基本上这个选项在修改之前对你的数据进行快照并将它们放在 tempdb 中,因此你会看到最后提交的记录是快照最后提交的记录。在这种情况下,另一个隔离级别 Read Uncommitted 将返回数据,但有一个很大的问题,即您将读取未提交的记录,并且很有可能读取脏记录。
SQL Server 中存在nolock和readpast作为锁提示的概念,用于避免锁定,但它有其自身的影响。
您可以通过此链接在 Microsoft 站点上阅读有关隔离级别的更多信息。
许多中小企业有很多关于这个主题的文章,我列出其中的一些供您参考:
Brent Ozar --> https://www.brentozar.com/archive/2013/01/implementing-snapshot-or-read-committed-snapshot-isolation-in-sql-server-a-guide/
肯德拉小--> https://littlekendra.com/2016/02/18/how-to-choose-rcsi-snapshot-isolation-levels/
埃里克·达林 --> https://www.brentozar.com/archive/2018/01/heaps-deletes-optimistic-isolation-levels/
保罗·怀特 --> https://sqlperformance.com/2014/07/t-sql-queries/isolation-levels
有一个来自 Brent Ozar(现在无法找到)的视频,他清楚地解释了您提到的 Oracle 和 SQL 服务器之间的区别。出于这个原因,Oracle 过去每核的成本比 SQL 服务器要高得多,但现在情况/场景有所不同。还要在这里添加一件事 - 在 azure 中,RCSI 是默认行为。
我希望以上有所帮助。实际上,这不是一个问题,而是一个非常重要的主题和对 SQL Server 的理解,并且很难在一个答案中涵盖它们,但是上面的链接肯定会引导您朝着正确的方向前进。
| 归档时间: |
|
| 查看次数: |
1362 次 |
| 最近记录: |