ちょっと先の未来クイズ第4問

 トランザクションについてネットでいろいろ調べたのですが、
ピンと来ていないので下記の意味合いで合っているのか、
教えて頂けないでしょうか?

・トランザクションは、データベースに対してかかる
(テーブル単位にかかるわけではない)

・SQLでINSERT、UPDATE、DELETEのようにテーブルに更新処理を
走らせた時、そのテーブルがロックされる

・コミットが終わるまではロックはかかったまま

・失敗すればロールバックでデータを元に戻せる

 …こんな風に考えていますが、
ここまでは合っているでしょうか?
また、下記からが疑問なんですが…

・ロックの種類は、SQLの書き方で決められるみたいですが、
特に指定しなかったらテーブルロックになるものなのでしょうか?

・SELECT中は、ロックがかかるものなのでしょうか?

A 回答 (3件)

#1です。



#2さんの書かれた「トランザクションの定義」を質問者さんが理解されていたかどうかはともかくとして、
質問者さんの書かれた「Oracleのトランザクションの性質」の理解は別に間違ってはいません。

>「トランザクションは、1つ以上のSQL文を含む論理作業単位です。トランザクションはアトミック(基本)な単位です。つまり、トランザクション内のすべてのSQL文は、すべてコミット(データベースに適用)されるか、すべてロールバック(データベースから取消し)されるかのどちらかになります。 トランザクションは、最初の実行可能なSQL文から開始します。トランザクションは、COMMIT文またはROLLBACK文を使用して明示的に、またはDDL文を発行して暗黙的にコミットまたはロールバックされた時点で終了します。」

トランザクションは対象が複数のテーブルにまたがったからといって、別に開始されたりするものではありません。その意味ではデータベースレベルの概念と言ってよいです。

また、INSERT/UPDATE/DELETEでもテーブルロックはかかります。ただ同時に行レベルでもロックがかかっているので「行ロックしかかからない」といわれるだけです。

取得されるロックは、以下の通りです(質問者さんのいう特に指定しない場合)
・SELECT          :ロックなし
・SELECT(FOR UPDATE句あり):行レベルの排他ロックとテーブルレベルの行共有ロック
・INSERT/UPDATE/DELETE   :行レベルの排他ロックとテーブルレベルの行排他ロック

実際には行レベルの排他ロックにより、他のトランザクションが同じ行に対するロックを取得するのを防いでいますが、同時に低いレベルのテーブルロックもかかることにより、たとえば
LOCK TABLE table IN SHARE MODE        :テーブルレベルの共有ロック
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE :テーブルレベルの共有行排他ロック
LOCK TABLE table IN EXCLUSIVE MODE :テーブルレベルの排他ロック
など、テーブルロックコマンドによるロック取得も防いでいます。

参考URL:http://otndnld.oracle.co.jp/document/products/or …
    • good
    • 0

色々間違っています。


まず、トランザクションについて話します。
トランザクションとは、その一連の処理が正しいか正しくないかです(厳密な定義は違いますが、わかりやすく説明のために簡単にしています)。
例えば、あなたが商品をひとつ買ったとします。
そうすると、コンピュータではこういった流れで処理されます。
商品の購入 → 在庫の減少 → 売り上げにつける → 色々。
さて、ここで問題です。
もし、在庫の減少は成功しても、売り上げにつける時に失敗したときどうなるでしょう?
答え・・・在庫が減っているのに売り上げがないということになります。店側としては、盗まれたと考えるしかありません。

 トランザクションの単位

            商品が売れた
(商品の購入 → 在庫の減少 → 売り上げにつける → 色々。)
が絶対に実行される必要があります。
そして、この絶対に実行されなくてはいけいないのが、「トランザクションの単位」です。
わかったでしょうか?

それから、Oracleは基本的にテーブルロックはかかりません。
行ロックです。まぁ、この辺はまだ先の話なのでスルーしてください。
    • good
    • 0

厳密な定義を追求するとキリがありませんが、考え方としては合っていると思います。



OTNの以下のリンクの「Oracle Databaseのデータ・ロックの方法」の部分を読めば、かなり厳密に理解できると思います。
http://otndnld.oracle.co.jp/document/products/or …

>・ロックの種類は、SQLの書き方で決められるみたいですが、
特に指定しなかったらテーブルロックになるものなのでしょうか?

 ドキュメントの通り、ロックがかかるケースはすべてテーブルロックとして説明されます。
 特に指定しないINSERT/UPDATE/DELETEはテーブルに行排他ロックがかかります。
 (行共有ロックと行排他ロックを行ロックとして、テーブルロックと別に理解しているのであれば、行単位にしかかからないといえるでしょう)

 また、FOR UPDATE句を含まない単純なSELECT文はロックは(共有ロックも)かかりません。
 だからテーブルに排他ロックを掛けたとしても、SELECTは可能です。

 この辺は他のDBMSでは違うものがあります。SQL ServerではSELECTも共有ロックを取得しにいくので、テーブルに排他ロックを掛けると、SELECTも待ちになります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す


おすすめ情報