共有ロック(ロック読み取り)の詳細な説明および排他ロック(書き込みロック)オプションをロックするSQL ServerのSELECT文

共有ロック(ロック読み取り)と排他ロック(書き込みロック)

 

共有ロック(Sロック):共有(S)が操作データを変更または更新するために使用されていない(読み取り専用動作)、このようなSELECT文など。

プラスへのトランザクションデータTがロックを共有している場合、他のトランザクションは唯一シェアプラスロックは排他ロックを追加することはできません。共有ロックトランザクションを許可されたデータのみを読み取ることができ、データを変更することはできません。

排他ロック(Xロック):このようINSERT、UPDATEまたはDELETEなどのデータ変更操作のために使用します。同時に同じリソースがありません複数の更新ことを確認してください。

プラス排他ロックへのトランザクションデータT場合は、他のトランザクションは、任意のタイプAに加えて任意の封鎖にすることはできません。どちらも、彼のロックを読んで、だけでなく、データを変更するトランザクションの行データを承認しました。

データの矛盾我々は、データベースを操作するとき、(データの衝突を)発生する並行性の問題が原因である可能性があり

楽観的ロック
オプティミスティック・ロックは、我々は自分自身を実現するために必要な、組み込みのデータベースではありません。作りながら、オプティミスティック・ロックは、データベース(更新)の操作は、アイデアは、他の特別な処理(つまり、ロックされていない)、データを扱う場合、この操作は、紛争にはつながらないということは非常に楽観的ではないときにことを意味し更新後に、競合があるかどうかを判断するために行きます。

典型的には、これが実現される:表中のデータ(更新)、データテーブルを操作プラスたびに、操作をバージョン(版)フィールドを与えるときに、バージョン番号を記録する部分がインクリメントされます。それは、その後、あなたがそのレコードのために(更新)操作したい場合は、彼らが同じであれば、現時点では判定値の最初のバージョンは、ちょうどチェックアウト時のバージョンの値に等しい、バージョンフィールドを取得し、歴史の一部をチェックアウトすることですこの期間中に、他のプログラムは、アップデートを実行することができ、それを操作しないように、バージョンフィールドの値がプラス1;値の発見版のバージョンの現時点での値は、更新は、この期間を持っている場合だけ出すために等しくありませんそこに操作する他のプログラムがあり、更新操作が実行されません。

例えば:

図3は、操作の単一のステップを含みます:

1.製品情報をご覧ください

ID =#{ID} t_goodsから(状態、ステータス、バージョン)を選択

2.製品情報に基づいて命令を生成します

3. 2の商品のステータスを変更します

更新t_goods 

セット状態= 2、バージョン=バージョン+ 1

ここで、ID =#{ID}とバージョン=#{バージョン}。

 

手動で楽観的ロックを実装するために加えて、オンラインのフレームワークの多くは、必要なときに、「楽観的ロックをhiberate」検索を所有し、それを試してみることがあり、このような休止として楽観的ロックを、達成するための良いパッケージです今そこにあります。


悲観的ロック
と楽観的ロックが悲観的に対応するロックです。悲観的ロックが同期するので、悲観的ロックでこのデータ競合が発生するデータを扱う、それは各動作中にロックをすることができ得ることによって、同一のデータ上で動作しなければならない場合、これは、Javaに非常に類似している必要がありますより多くの時間を費やしています。対応するロック楽観に加えて、悲観的ロックは、データベース自体によって達成され、時間を使用し、我々は直接の関連文データベースを呼び出します。

ここでは、他の二つの概念をロックする悲観的ロックが出てきた、彼らは共有ロックと排他ロックされているに関するものです。共有ロックと排他的ロックは、悲観的ロックは、悲観的ロックタリアは、の範囲に属する異なる実装されています。

 

共有ロック
共有ロックは、同じリソース上で同じロックを共有し、異なるトランザクションの数を指します。それはより多くのキーを持っているのと同じ、同じドアの等価。このように、あなたの家のドアがあり、ドアには、いくつかのキーがありますが、あなたは1を持っている、あなたはガールフレンドを持っている、あなたは、このキーを通して、あなたの家に入る良くなっ性交のセッションを行って、何カザフスタンを理解する可能性があり、はい、これはいわゆる共有ロックです。
ただ、悲観的ロックは、一般的なデータベースが達成された、共有ロックはまた、それを呼び出すためにwhatコマンドを通じて、悲観的ロックにMySQLで、共有ロックを属していると言います。共有ロックと相まって特定のリソースに代わって共有モードでのバックプラスロックでステートメントを実行することによって、学習した情報を照会することによって。
例えば、私は、ステートメントのコミットを実行しないトランザクションを開くためにした2つのMySQLのクエリエディタで、ここで開かれ
、次のように都市表DDLを
CREATE TABLEの`city`(
` id` BIGINT(20)NOT NULL AUTO_INCREMENT、
`name`のVARCHAR (255)デフォルトNULL、
`state` VARCHAR(255)は、デフォルトのNULL、
PRIMARY KEY(` id`)
)18がAUTO_INCREMENT InnoDBエンジン= DEFAULT CHARSET = UTF8で=。

 

ベギン;
共有モードでの都市のid =「1」ロックからSELECT *;

そして、idは、データを更新するための別のクエリウィンドウ1

 

都市セット名を更新=「666」 ID =「1」の場合、
このような場合は、インタフェースは数秒後の状態カトンに入り、エラーメッセージ
[SQL]は都市セット名を更新= 「666」ここで、ID = " 1「;
[のErr] 1205 -待機タイムアウトをロック数を超え;試みは、トランザクションを再起動します

レコードがコミットされていないする前に、= 1つのロックが成功したレコードidのために、証明するために、このレコードID = 1がロックされ、そして唯一のトランザクションでロックをオフ解除後に動作させる、または使用このデータを操作するために共有ロック。
そして、少し実験:

 

都市が共有モードに名前=「666」ID =「1」ロックを設定更新します。
[のErr] 1064 -あなたはあなたのSQL構文でエラーが発生しています。1行目で近くのシェアモードでのロック」を使用する権利構文についてはMySQLサーバのバージョンに対応するマニュアルを確認してください


共有ロックを追加した後、また、エラーメッセージ、および、知って更新するように、挿入文が自動的にロックした行の理由を追加する削除情報を照会

だから、私は共有モードでの都市のid =「1」ロックからSELECT *を試してみました。

 

今回の成功。

 


排他ロック
排他ロックと共有ロック対応、同じリソースに対してのみロックを有することができ、異なるトランザクションの数を指します。
そして、文が実行されるようにした後、ロックの種類を共有することは、更新のためにプラスすることができ


行ロック
行ロックは、文字通りの意味を理解し、それが記録プラスロックで行ロックを、追加することです。

例えば、ロックステートメントを共有するプレゼンテーションの前に

共有モードでの都市のid =「1」ロックからSELECT *; 

都市テーブルIDの主キーフィールドのため、それはまた、インデックスに対応します。ロックを行う場合、このインデックスは、IDレコード1プラスロックし、ロックが行ロックです。

 

テーブルロック
テーブルロックとテーブルロックに追加し、対応する行をロックします。

研究されてそこでのMyISAMエンジン、

-------------------------------------------------- ---------------------
SQLクエリは、Sロックを追加し、問い合わせた後、ロックが解除された場合、Sは、ロックを解除します。しかし、あなたのselect文は、SQL文を遮断する効率に依存してどのくらいの時間、完了していないに依存して血栓を形成します
 
あなたの分離レベルに応じて、デフォルトではプラスSロックです。
選択テーブルロックが保持されていることにより、
より多くの目詰まり、あなたは時間の閉塞を最小限にするためにこれらのインデックス、トランザクション、およびその他の調整ロック粒度に依存することができます
-------------------------------------------------- --------------------
SQL Serverは、並行性と高性能データベースシステムの実現を支援するための強力かつ完全なロック機構を提供します。また、select文で予想達成するために、「ロックオプション」の効果を使用することができますユーザーは、デフォルト設定のSQL Serverを使用することはできません。この記事では、「ロックのオプション」とそれに対応する機能の説明でSELECT文を記述します。   

機能:    

NOLOCK(ロック解除)   

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

HOLDLOCK(ロックを保ちます)   

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

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

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

PAGLOCK(ページ・ロック)これは、選択したときに、SQL Serverは共有ページ・ロックを使用して、デフォルトのオプションです。      

 
  TABLOCKX(排他テーブル・ロック)このオプションを選択すると、SQL Serverは、順序またはトランザクションが終了するまで、テーブル全体に排他ロックを設定します。これは、テーブル内のデータを読み取ったり変更する他のプロセスを防ぐことができます。     
 
  これらのオプションは、システムが以前にSET文で設定するトランザクション分離レベル(トランザクション分離レベルを)無視することができます。詳細については、SQL Serverのオンラインマニュアルを参照してください。

 

例:

テーブル名から*を選択する場所...と(NOLOCK)

テーブル名から*を選択する場所...と(HOLDLOCK)

ロックデータベース・テーブルとの間の差SELECT *(ROWLOCK)とテーブル名の場合、ID = 3注

(HOLDLOCK)その他の取引WITHテーブルSELECT * FROMテーブルを読み込むことができますが、更新を削除することはできません

(TABLOCKX)WITH他のトランザクションテーブルからSELECT *は、テーブル、更新を読み、削除することはできません。

共有ロック(Sロック):共有(S)が操作データを変更または更新するために使用されていない(読み取り専用動作)、このようなSELECT文など。

プラスへのトランザクションデータTがロックを共有している場合、他のトランザクションは唯一シェアプラスロックは排他ロックを追加することはできません。共有ロックトランザクションを許可されたデータのみを読み取ることができ、データを変更することはできません。

排他ロック(Xロック):このようINSERT、UPDATEまたはDELETEなどのデータ変更操作のために使用します。同時に同じリソースがありません複数の更新ことを確認してください。

プラス排他ロックへのトランザクションデータT場合は、他のトランザクションは、任意のタイプAに加えて任意の封鎖にすることはできません。どちらも、彼のロックを読んで、だけでなく、データを変更するトランザクションの行データを承認しました。

データの矛盾我々は、データベースを操作するとき、(データの衝突を)発生する並行性の問題が原因である可能性があり

楽観的ロック
オプティミスティック・ロックは、我々は自分自身を実現するために必要な、組み込みのデータベースではありません。作りながら、オプティミスティック・ロックは、データベース(更新)の操作は、アイデアは、他の特別な処理(つまり、ロックされていない)、データを扱う場合、この操作は、紛争にはつながらないということは非常に楽観的ではないときにことを意味し更新後に、競合があるかどうかを判断するために行きます。

典型的には、これが実現される:表中のデータ(更新)、データテーブルを操作プラスたびに、操作をバージョン(版)フィールドを与えるときに、バージョン番号を記録する部分がインクリメントされます。それは、その後、あなたがそのレコードのために(更新)操作したい場合は、彼らが同じであれば、現時点では判定値の最初のバージョンは、ちょうどチェックアウト時のバージョンの値に等しい、バージョンフィールドを取得し、歴史の一部をチェックアウトすることですこの期間中に、他のプログラムは、アップデートを実行することができ、それを操作しないように、バージョンフィールドの値がプラス1;値の発見版のバージョンの現時点での値は、更新は、この期間を持っている場合だけ出すために等しくありませんそこに操作する他のプログラムがあり、更新操作が実行されません。

例えば:

図3は、操作の単一のステップを含みます:

1.製品情報をご覧ください

ID =#{ID} t_goodsから(状態、ステータス、バージョン)を選択

2.製品情報に基づいて命令を生成します

3. 2の商品のステータスを変更します

更新t_goods 

セット状態= 2、バージョン=バージョン+ 1

ここで、ID =#{ID}とバージョン=#{バージョン}。

 

手動で楽観的ロックを実装するために加えて、オンラインのフレームワークの多くは、必要なときに、「楽観的ロックをhiberate」検索を所有し、それを試してみることがあり、このような休止として楽観的ロックを、達成するための良いパッケージです今そこにあります。


悲観的ロック
と楽観的ロックが悲観的に対応するロックです。悲観的ロックが同期するので、悲観的ロックでこのデータ競合が発生するデータを扱う、それは各動作中にロックをすることができ得ることによって、同一のデータ上で動作しなければならない場合、これは、Javaに非常に類似している必要がありますより多くの時間を費やしています。対応するロック楽観に加えて、悲観的ロックは、データベース自体によって達成され、時間を使用し、我々は直接の関連文データベースを呼び出します。

ここでは、他の二つの概念をロックする悲観的ロックが出てきた、彼らは共有ロックと排他ロックされているに関するものです。共有ロックと排他的ロックは、悲観的ロックは、悲観的ロックタリアは、の範囲に属する異なる実装されています。

 

共有ロック
共有ロックは、同じリソース上で同じロックを共有し、異なるトランザクションの数を指します。それはより多くのキーを持っているのと同じ、同じドアの等価。このように、あなたの家のドアがあり、ドアには、いくつかのキーがありますが、あなたは1を持っている、あなたはガールフレンドを持っている、あなたは、このキーを通して、あなたの家に入る良くなっ性交のセッションを行って、何カザフスタンを理解する可能性があり、はい、これはいわゆる共有ロックです。
ただ、悲観的ロックは、一般的なデータベースが達成された、共有ロックはまた、それを呼び出すためにwhatコマンドを通じて、悲観的ロックにMySQLで、共有ロックを属していると言います。共有ロックと相まって特定のリソースに代わって共有モードでのバックプラスロックでステートメントを実行することによって、学習した情報を照会することによって。
例えば、私は、ステートメントのコミットを実行しないトランザクションを開くためにした2つのMySQLのクエリエディタで、ここで開かれ
、次のように都市表DDLを
CREATE TABLEの`city`(
` id` BIGINT(20)NOT NULL AUTO_INCREMENT、
`name`のVARCHAR (255)デフォルトNULL、
`state` VARCHAR(255)は、デフォルトのNULL、
PRIMARY KEY(` id`)
)18がAUTO_INCREMENT InnoDBエンジン= DEFAULT CHARSET = UTF8で=。

 

ベギン;
共有モードでの都市のid =「1」ロックからSELECT *;

そして、idは、データを更新するための別のクエリウィンドウ1

 

都市セット名を更新=「666」 ID =「1」の場合、
このような場合は、インタフェースは数秒後の状態カトンに入り、エラーメッセージ
[SQL]は都市セット名を更新= 「666」ここで、ID = " 1「;
[のErr] 1205 -待機タイムアウトをロック数を超え;試みは、トランザクションを再起動します

レコードがコミットされていないする前に、= 1つのロックが成功したレコードidのために、証明するために、このレコードID = 1がロックされ、そして唯一のトランザクションでロックをオフ解除後に動作させる、または使用このデータを操作するために共有ロック。
そして、少し実験:

 

都市が共有モードに名前=「666」ID =「1」ロックを設定更新します。
[のErr] 1064 -あなたはあなたのSQL構文でエラーが発生しています。1行目で近くのシェアモードでのロック」を使用する権利構文についてはMySQLサーバのバージョンに対応するマニュアルを確認してください


共有ロックを追加した後、また、エラーメッセージ、および、知って更新するように、挿入文が自動的にロックした行の理由を追加する削除情報を照会

だから、私は共有モードでの都市のid =「1」ロックからSELECT *を試してみました。

 

今回の成功。

 


排他ロック
排他ロックと共有ロック対応、同じリソースに対してのみロックを有することができ、異なるトランザクションの数を指します。
そして、文が実行されるようにした後、ロックの種類を共有することは、更新のためにプラスすることができ


行ロック
行ロックは、文字通りの意味を理解し、それが記録プラスロックで行ロックを、追加することです。

例えば、ロックステートメントを共有するプレゼンテーションの前に

共有モードでの都市のid =「1」ロックからSELECT *; 

都市テーブルIDの主キーフィールドのため、それはまた、インデックスに対応します。ロックを行う場合、このインデックスは、IDレコード1プラスロックし、ロックが行ロックです。

 

テーブルロック
テーブルロックとテーブルロックに追加し、対応する行をロックします。

研究されてそこでのMyISAMエンジン、

おすすめ

転載: www.cnblogs.com/zhoading/p/11730446.html