SQLServerのいたるところにnolockが追加される理由

https://blog.csdn.net/yangjiechao945/article/details/81355558から転送されました

 

同社の.netプロジェクトでは、多くのロジックがストアドプロシージャに実装されており、クエリにWITH(NOLOCK)が追加されていることがわかります。

MySQLとSQLServerのデフォルトのトランザクション保守メカニズムは異なります。

デフォルトでは、SQLServerのトランザクションは特定の値を変更します。トランザクションがコミットされる前に、他の接続は変更された値を読み取るためにブロックされます。変更された値を読み取るためにnolockを追加すると(つまり、ダーティ)、この値は最終的には読み取られる可能性があるためです。ロールバック)

MySQLのデフォルトでは、トランザクションは特定の値を変更します。トランザクションがコミットされる前に、他の接続は変更された値を読み取るためにブロックされず、変更前の値が読み取られます。

インターネット企業の場合、ほとんどのシナリオでは、読み取りをブロックするトランザクションを記述したくありません。

したがって、SQLServerはnolockを追加することをお勧めします

MySQL自体はブロックせず、nolockは無意味です。

 

最初に、MySQLでクエリステートメントを記述し、見た目よりもnolockを追加して、構文が正しくないことを示しました。READUNCOMMITTEDですか?それでも構文が正しくないことを示しています。

MySQLはnolockのような構文をサポートしていないようです

次に質問は、となり、なぜMySQLのは、支持NOLOCKと他の文法に必要はありませんない、または場合MySQLはNOLOCKをサポートしていない、テーブルが原因レコードの変更にどのようにロックされている場合はどうなりますか?

だから私は次の実験をしました

2つのMySQL接続を開きました(ちなみに、使用するクライアントはSQLyogであるため、各「クエリ」はSQL Server Management Studioのような接続だと思いました。実際、各接続は「新しい接続を作成」する必要があります。 "、私は長い間テストした後にこの問題を見つけました)

 最初のMySQL接続がクエリを実行します

トランザクションを開始します。
UPDATEテストテーブルSETNAME = 'newvalue' WHERE id = 1

トランザクションはコミットされていないため、デフォルトでSQL Serverの場合、2番目の接続は同じレコードを再度クエリし、確実にブロックされます。SQLServerクエリがNolockを追加し、まだコミットされていないダーティ値「newvalue」を読み取る場合

クエリを実行する2番目のMySQL接続

SELECT * FROM `testtable`

ブロッキングもダーティ読み取りも発生せず、古い値が照会され、コミットされていない新しい値newvalueが読み取られなかったことがわかりました

 

おすすめ

転載: blog.csdn.net/johnt25/article/details/112857842