データベースのロックへのSQL文とテーブルのロックを解除

ロックは、データベース内の非常に重要な概念である、主に、マルチユーザー環境のデータベースの整合性と一貫性を確保するために使用されます。 私たちは、複数のユーザーが同時に同じデータベース内のデータを操作することができることを知って、データの不整合が発生する可能性があります。それがロックされていて、彼らのビジネスの問題かもしれ同じデータを使用しているとき、複数のユーザーが同時に、その後、データベースにアクセスしていない場合。これらを含める:失われた更新を、ダーティリード、幻想非反復可能読み取りとをお読みください。

1。ロストアップデート:

二つ以上のトランザクションが同じ行を選択し、行を更新するために、初期値に基づいて選択すると、失われた更新の問題が発生します。各トランザクションは他のトランザクションの存在を認識していません。最後の更新は、データ損失の原因となる他の企業によって行われた更新を、上書きされます。例えば、二つの編集者は同じ文書の電子コピーを作りました。各エディタは、独立してそのレプリカを変更し、変更のコピーを保存し、これ原稿をカバーします。最後に、編集スタッフによって行われた最初の変更をカバーする編集スタッフのコピーに変更を保存します。最初の編集が完了した後、第2のエディタは、変更を行うためにする場合は、この問題を回避することができます。

2。ダーティー読み取り

ダーティリードは、トランザクションがデータにアクセスしているときを指し、データが変更されており、この変更は、その後、別のトランザクションが、データにアクセスし、このデータを使用してデータベースに提出されていません。データはまだコミットされていないので、このデータは、その後、別のトランザクションは、このデータがダーティデータは、操作が間違っているダーティデータを参照することができるで読みます。例えば、電子文書を変更しているエディタ。変更プロセスでは、他のエディタは(これまでに行ったすべての変更のコピーを含む)と、意図されたユーザに配布文書をコピーしました。それ以来、最初の編集スタッフは、変更は現在間違って、その後、私は編集を削除し、文書を保存していると信じています。ユーザーのドキュメントに配布することはもはや存在しており、これらの編集は存在しなかったと信じていなければならない編集が含まれています。誰もが文書の変更を読み取ることができる前に、最初の編集スタッフは、最終的な変更を決定する場合は、この問題を回避することができます。

3。非反復可能読み取り

非反復可能読み取りは、同じデータを複数回読んで、トランザクション内を意味します。この取引が終わっていない場合は、別のトランザクションは、同じデータにアクセスします。二つによる第2のトランザクションの変形に、第一のトランザクション内のデータを読み取る間にので、次に最初の二つのトランザクションは、データが異なっていてもよい読み取ります。これには、非反復可能読み取りと呼ばれる2件の読み出しデータが同じでない取引で発生しました。例えば、二度同じ文書を読んエディタは、しかし、2回の測定値の間で、作者は文書を書き換えます。第二編集スタッフは、ドキュメントを読んだとき、文書が変更されました。原稿の読み取りを繰り返すことはできません。唯一の著者は文書を読むことができます編集スタッフの準備を完了した場合は、この問題を回避することができます。

4。幻覚を読みます

これは、トランザクションが独立して行われていない場合、例えば、テーブル内の最初のトランザクションデータは、この変形例は、テーブル内のすべてのデータ行を含む、修飾された発生読み出し錯視現象を指します。また同時に、このテーブルのデータを変更する第2のトランザクションで、本変形例は、テーブルに新しい行を挿入することです。そして、ユーザは、最初のトランザクションが同じで幻覚が起こったかのように、データラインの修正は、存在しないテーブルの発見後に発生します動作します。例えば、変更文書作成者は編集スタッフを提出するが、その内容を変更します生産部門は、ドキュメントの原本に合併するとき、作者はドキュメントに新しい未編集材料のほかことを見出しました。編集スタッフと生産部門は、元の文書の処理を完了させる前に、誰もが自分のドキュメントに新しい材料を追加することはできない場合は、問題を回避することができます 

 

SELECT文では、「ロックオプション」機能を説明しました

SQL Serverは、並行性と高性能データベースシステムの実現を支援するための強力かつ完全なロック機構を提供します。唯一のデフォルト設定のSQL Serverを使用することはできませんまた、ユーザーは、「select文で使用することができるロックオプションの予想を達成する効果」

1. NOLOCK(ロック解除)

このオプションは、データの読み取りまたは変更ロックを使用せず、SQL Serverを選択した場合。この場合、ユーザは、(ロールバック)完了(コミットされていないトランザクション)またはロールバックされていない、すなわち、いわゆるデータトランザクションを読みする可能性がある「汚いです」。

2. HOLDLOCK(保管ロック)

このオプションを選択すると、SQL Serverの共有ロックは道を解放せず、この全体のトランザクションが終了するまで残ります。

SELECT  *  FROM   WITHHOLDLOCK 
他のトランザクションがテーブルを読み込むことができますが、更新を削除することはできません

3. UPDLOCK(変性ロック)

このオプションを選択すると、SQL Serverがデータを読み込む代わりにロックを共有するときに変更ロックを使用しており、このロックは、トランザクション全体またはコマンドが終了するまで保持されています。複数のプロセスが同時にデータを読み取ることができますが、プロセスはデータのみを変更することができることを保証するためには、このオプションを使用します。

UPDLOCK.UPDLOCKの利点最後の読み出しデータが変更されていないので、そのデータを確保しながら、あなたは後で、更新されたデータ(他のトランザクションをブロックせず)のデータを読み取ることができます。私たちは、読むためにUPDLOCKを使用すると、更新ロックと一緒に取得するには、レコードにそのロック記録プラスレコードは唯一このスレッドの終了後に変更することがあるので、他のスレッドの業務に変更することはできませんすることができます。

例:

別のクエリで:
 BEGIN  TRANSACTIONを
SELECT  *  FROM MYTABLE WITH(UPDLOCK)WHERE同上における123 WAITFOR遅延' 午後12時00分10秒'  
を更新 MYTABLE SET  [ ] = ' ZZ ' 同上における1。23 コミットTRANSACTIONを
:で別のクエリでSELECT * FROM 

  MYTABLE WHERE同上における123 
直ちにデータを照会することができます。

あなたは、このような他の更新ロックを実行する必要性などのデータを更新する場合でも、解放されています。
更新 MYTABLE SET  [ ] = ' ZZ ' 同上における123

これは時々私が読んだ後に更新することが許可されていないレコードを制御する必要があるので、私は、現在のレコードにすべてのクエリに対処することができますが、後にクエリを変更し、他のトランザクションを防ぐために、更新ロックと結合していることを示しています。トランザクションの影響は最小限に抑えられます

4. TABLOCK(ロック表)

このオプションを選択すると、SQL Serverはテーブル全体でのコマンドの終了まで共有ロックを設定します。このオプションは、他のプロセスが読み取ることができることを保証しますが、データを変更することはできません。

5. TABLOCKX(排他テーブル・ロック)

このオプションを選択すると、SQL Serverは、順序またはトランザクションが終了するまで、テーブル全体に排他ロックを設定します。これは、テーブル内のデータを読み取ったり変更する他のプロセスを防ぐことができます。

SELECT * FROM table WITH (TABLOCKX)

其他事务不能读取表,更新和删除

6. PAGLOCK(页锁)

此选项为默认选项, 当被选中时,SQL Server 使用共享页锁。

7. ROWLOCK (强制使用行锁) 

一直有个疑问,使用 select * from dbo.A with(RowLock) WHRE a=1 这样的语句,系统是什么时候释放行锁呢??
经过官方文档考证后,原来 RowLock在不使用组合的情况下是没有任何意义的,所谓“解铃还须系铃人~”
With(RowLock,UpdLock) 这样的组合才成立,查询出来的数据使用RowLock来锁定,当数据被Update的时候,或者回滚之后,锁将被释放 

 

おすすめ

転載: www.cnblogs.com/zhaoyl9/p/10856170.html