web-dev-qa-db-ja.com

SQL ServerとOracleのロック

MSSQLサーバーとOracleでロック/ブロックのテストをいくつか行ってきましたが、1つの違いに気づきました。

Oracleでは、コミットまたはロールバックを発行せずに1行の更新を実行しました。別のセッションでは、基になるレコードを表示できます。もちろん、まだコミットされていない値ではなく、最後にコミットされたデータを表示できます。

MSSQLサーバー-別のセッションで同じ操作を行ったとき、SQLサーバーは更新される行のコミットまたはロールバックを待機し続けました。

MSSQLサーバーとOracleの間のロックメカニズムについて誰かが説明してくれませんか。

10
Danilo Neto

これはSQLサーバーのデフォルトの動作であり、分離レベルを呼び出すために必要なことを詳しく理解しています。上記で説明したのは、「Read Committed」と呼ばれる分離レベルです。 SQLサーバーでのOracleのような同様の動作が必要な場合は、コミットされたスナップショットデータベースの読み取りオプションをオンにする必要があります。基本的に、このオプションは変更前のデータのスナップショットを取得してtempdbに配置するため、スナップショットであった最後にコミットされたレコードが表示されます。最後にコミットされたレコードの。この状況では、別の分離レベルのRead Uncommittedでデータが返されますが、大きな問題があります。つまり、コミットされていないレコードが読み取られ、ダーティレコードが読み取られる可能性がかなりあります。

SQLサーバーには、ロックを回避するためのロックヒントとしてnolockおよびreadpastの概念がありますが、独自の影響があります。

分離レベルの詳細については、Microsoftのサイト link を参照してください。

多くのSMEからのこの主題に関するたくさんの記事があります、私はあなたの参照のためにそれらのいくつかをリストしています:

  1. ブレントオザー-> 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-to-ask /

Brent Ozarからのビデオがあります(現在は見つかりません)。彼は、あなたが言及したOracleとSQLサーバーの違いを明確に説明しています。このため、以前はコアあたりのSQLサーバーよりもはるかに早くOracleのコストがかかっていましたが、現在はケース/シナリオが異なります。ここでもう1つ追加すること-Azureでは、RCSIがデフォルトの動作です。

上記がお役に立てば幸いです。実際、これはSQLサーバーの非常に重要なトピックと理解よりも問題ではなく、1つの回答でそれらをカバーすることは困難ですが、上記のリンクは間違いなく正しい方向に導きます。

9