トランザクションについてネットでいろいろ調べたのですが、
ピンと来ていないので下記の意味合いで合っているのか、
教えて頂けないでしょうか?
・トランザクションは、データベースに対してかかる
(テーブル単位にかかるわけではない)
・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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
他の処理でselectさせないよう...
-
DELETE文でFROM句を省略した場合
-
同じSELECT文同士でのデ...
-
カーソルについて
-
ActiveX DLLでのオラクルのトラ...
-
年度毎にシーケンスの初期化?
-
accessでイベントを中止するよ...
-
object browser で処理を中断す...
-
データを削除しても表領域の使...
-
ACCESS 複数テーブル・複数フィ...
-
INDEXの無効化
-
テーブルからのselectにおいて...
-
異なるスキーマからデータを抽...
-
Viewにインデックスは張れ...
-
Access レコードを追加できませ...
-
データ読込時のタイムアウト
-
viewのバックアップ
-
CLOB型へのINSERT
-
異なるスキーマからビュー作成
-
oracleのimpdpでORA-39166
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DELETE文でFROM句を省略した場合
-
RDBのテーブル種類の違い
-
他の処理でselectさせないよう...
-
object browser で処理を中断す...
-
同じSELECT文同士でのデ...
-
accessでイベントを中止するよ...
-
PL/SQLの平行処理について
-
DBリンクエラーについて
-
[性能改善]AccessのDBに大量の...
-
年度毎にシーケンスの初期化?
-
Access2013で操作ログを残した...
-
統計情報の取得=コミットですか?
-
処理速度の見積もり時間について。
-
Oracleから見たOracleの優位性(...
-
チューニング対象のSQLの見つけ...
-
テーブル名を指定してCsv出力
-
カーソルについて
-
C#でトランザクション開始後参...
-
SQLServerのロック?について
-
行ロックとテーブルロックについて
おすすめ情報