2012-07-04 14 views
14

SQL Serverの分離/ロックを理解しようとしています。私が読んでシナリオを以下しているREAD COMMITTED分離レベルでロックを保持/解放するとき

は、我々は、テーブルを持っている分離レベル(デフォルト)

を犯しました。

選択が 共有ロックを解雇されたとき、私は

を理解MSDNから今

create table Transactions(Tid int,amt int) 

with some records 

insert into Transactions values(1, 100) 
insert into Transactions values(2, -50) 
insert into Transactions values(3, 100) 
insert into Transactions values(4, -100) 
insert into Transactions values(5, 200) 

が他のトランザクションは(ダーティリードの回避)のデータを変更することはできませんので、撮影します。..ドキュメントは、行レベルの話、ページレベル、テーブルレベルのロック。私は私が理解したいことは、共有ロックを取得している(行、ページ、テーブル)されるだろう時間の何期間にある以下のscenarion

Begin Transaction 

select * from Transactions 

/* 
some buisness logic which takes 5 minutes 

*/ 

Commit 

考えます。

ステートメントselect * from Transactionsが実行されている場合、またはCOMMITに達するまで5分以上にわたって取得される場合にのみロックが取得されます。

答えて

6

ロックは唯一select * from Transaction

を使用すると、SQLセッションを開く以下のコード

でそれを確認することができます実行されたときに取得し、このクエリ

Begin Transaction 

select * from Transactions 

WAITFOR DELAY '00:05' 
/* 
some buisness logic which takes 5 minutes 

*/ 

Commit 

を開き、別のSQLセッションを実行し、クエリの下に実行されます

Begin Transaction 
Update Transactions 
Set = ... 
where .... 
commit 
19

あなたは間違った質問をしていますあなたはの実装の詳細を心配しています。あなたが考えなければならないことと懸念すべきことは、分離レベルのセマンティクスです。ケンドラリトルは、それらを説明する良いポスターを持っています:Free Poster! Guide to SQL Server Isolation Levels

ご質問は以下のように言い換えることが必要です。私はどのような項目が表示されます。

はアイテム

Q SELECT * FROM?
A:コミットされたすべてのアイテム

Q:コミットされていないトランザクションにアイテムが挿入/削除/更新された場合はどうなりますか?
A:コミットされていないすべてのアイテムがコミット(またはロールバック)されるまで、SELECTはブロックされます。

Q:新しいアイテムが挿入/削除/更新されるとどうなりますか私は上記のクエリを実行しますか?
A:結果は不明です。いくつかの変更が表示され、他のものが表示されず、一部がコミットされるまでブロックされる可能性があります。

READ COMMITTEDは、トランザクションの長さとは無関係に、文が終了すると約束しません。ステートメントを再度実行すると、以前と同じセマンティクスが再現され、以前に見たアイテムは変更され、消えて新しいアイテムが表示されます。明らかに、これはあなたが選択した後にに変更することを意味します。

高いレベルの分離レベルはより強い保証を提供します:REPEATABLE READは、あなたがコミットするまで、最初に選択したアイテムは変更または削除できないことを保証します。 SERIALIZABLEは、コミットする前に2番目の選択項目に新しい項目が表示されないという保証を追加します。

これは理解する必要がありますが、実装メカニズムの仕組みはありません。これらの概念をマスターしたら、実装の詳細を尋ねることができます。それらはすべてTransaction Processing: Concepts and Techniquesに記載されています。

+0

ローロックの代わりにテーブルロックを取得する場合、実装の詳細は重要です。 – matao

+0

ケンドラの小さなリンクが壊れています – TinyTheBrontosaurus

6

あなたの質問は良いです。取得されるロックの種類を理解することで、DBMSを深く理解することができます。 SQL Serverでは、すべての分離レベル(読み取りコミットなし、読み取りコミット(既定)、反復可能読み取り、シリアル化可能)の下で、排他ロックは書き込み操作で取得されます。

排他レベルに関係なく、トランザクションが終了すると排他ロックが解放されます。

分離レベルの違いは、共有(読み取り)ロックが取得/解放される方法を指します。

コミットされていない分離レベルでは、共有ロックは取得されません。この分離レベルでは、 "Dirty Reads"(トランザクションが別の実行中のトランザクションによって変更され、コミットされていない行からデータを読み取ることが許可されているため、ロールバックできます)という同時実行性の問題が発生します。

コミットされた分離レベルの下では、関連するレコードに対して共有ロックが取得されます。共有ロックは、現在の命令が終了すると解放されます。この分離レベルでは、「ダーティ・リード」は防止されますが、他の同時トランザクションである「反復不可能な読取り」(トランザクションAが行を取得し、トランザクションBが行を更新した後、トランザクションAが後で同じ行を再度取得しますトランザクションAは同じ行を2回取得しますが、異なるデータを参照します)または「Phantom Reads」(トランザクション中に2つの同一のクエリが実行され、2番目のクエリによって返された行のコレクションが最初のものとは異なります) 。

反復可能読み取りの分離レベルでは、共有ロックはトランザクション期間中取得されます。 "Dirty Reads"と "Non-Repeatable Reads"は防止されますが、 "Phantom Reads"は引き続き発生します。

シリアライズ可能な分離レベルでは、トランザクション期間中にレンジ共有ロックが取得されます。上記の並行処理の問題は発生しませんが、パフォーマンスが大幅に低下し、デッドロックが発生するリスクがあります。

関連する問題