
トランザクションについてネットでいろいろ調べたのですが、
ピンと来ていないので下記の意味合いで合っているのか、
教えて頂けないでしょうか?
・トランザクションは、データベースに対してかかる
(テーブル単位にかかるわけではない)
・SQLでINSERT、UPDATE、DELETEのようにテーブルに更新処理を
走らせた時、そのテーブルがロックされる
・コミットが終わるまではロックはかかったまま
・失敗すればロールバックでデータを元に戻せる
…こんな風に考えていますが、
ここまでは合っているでしょうか?
また、下記からが疑問なんですが…
・ロックの種類は、SQLの書き方で決められるみたいですが、
特に指定しなかったらテーブルロックになるものなのでしょうか?
・SELECT中は、ロックがかかるものなのでしょうか?
No.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 …
No.2
- 回答日時:
色々間違っています。
まず、トランザクションについて話します。
トランザクションとは、その一連の処理が正しいか正しくないかです(厳密な定義は違いますが、わかりやすく説明のために簡単にしています)。
例えば、あなたが商品をひとつ買ったとします。
そうすると、コンピュータではこういった流れで処理されます。
商品の購入 → 在庫の減少 → 売り上げにつける → 色々。
さて、ここで問題です。
もし、在庫の減少は成功しても、売り上げにつける時に失敗したときどうなるでしょう?
答え・・・在庫が減っているのに売り上げがないということになります。店側としては、盗まれたと考えるしかありません。
トランザクションの単位
商品が売れた
(商品の購入 → 在庫の減少 → 売り上げにつける → 色々。)
が絶対に実行される必要があります。
そして、この絶対に実行されなくてはいけいないのが、「トランザクションの単位」です。
わかったでしょうか?
それから、Oracleは基本的にテーブルロックはかかりません。
行ロックです。まぁ、この辺はまだ先の話なのでスルーしてください。
No.1
- 回答日時:
厳密な定義を追求するとキリがありませんが、考え方としては合っていると思います。
OTNの以下のリンクの「Oracle Databaseのデータ・ロックの方法」の部分を読めば、かなり厳密に理解できると思います。
http://otndnld.oracle.co.jp/document/products/or …
>・ロックの種類は、SQLの書き方で決められるみたいですが、
特に指定しなかったらテーブルロックになるものなのでしょうか?
ドキュメントの通り、ロックがかかるケースはすべてテーブルロックとして説明されます。
特に指定しないINSERT/UPDATE/DELETEはテーブルに行排他ロックがかかります。
(行共有ロックと行排他ロックを行ロックとして、テーブルロックと別に理解しているのであれば、行単位にしかかからないといえるでしょう)
また、FOR UPDATE句を含まない単純なSELECT文はロックは(共有ロックも)かかりません。
だからテーブルに排他ロックを掛けたとしても、SELECTは可能です。
この辺は他のDBMSでは違うものがあります。SQL ServerではSELECTも共有ロックを取得しにいくので、テーブルに排他ロックを掛けると、SELECTも待ちになります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
accessでイベントを中止するよ...
-
DELETE文でFROM句を省略した場合
-
RDBのテーブル種類の違い
-
object browser で処理を中断す...
-
テーブル名を指定してCsv出力
-
同じSELECT文同士でのデ...
-
PL/SQLの平行処理について
-
Viewにインデックスは張れ...
-
データを削除しても表領域の使...
-
ORA-00959: 表領域'****'は...
-
INDEXの無効化
-
datapumpの実行方法について
-
viewのバックアップ
-
テーブルからのselectにおいて...
-
create table時のINITIALとMAXE...
-
異なるスキーマからデータを抽...
-
truncate文で全テーブルを一気...
-
ACCESS 複数テーブル・複数フィ...
-
CLOB型へのINSERT
-
dba_extentsの考え方について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DELETE文でFROM句を省略した場合
-
他の処理でselectさせないよう...
-
object browser で処理を中断す...
-
RDBのテーブル種類の違い
-
同じSELECT文同士でのデ...
-
PL/SQLの平行処理について
-
年度毎にシーケンスの初期化?
-
[性能改善]AccessのDBに大量の...
-
accessでイベントを中止するよ...
-
C#でトランザクション開始後参...
-
処理速度の見積もり時間について。
-
Oracleから見たOracleの優位性(...
-
チューニング対象のSQLの見つけ...
-
カーソルについて
-
統計情報の取得=コミットですか?
-
Access2013で操作ログを残した...
-
ロングトランザクションについて
-
処理が終わったり終わらなかっ...
-
同一レコード更新時の排他制御
-
トランザクションのデータ件数...
おすすめ情報