こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ロックについて

データベース初心者ですが、よろしくお願いします。

トランザクション処理のロック制御について質問です。
例えば、ユーザAが表に対しupdateを行い、commitを行わなかったとします。このときに、他のユーザBがその表に対しupdateを行った場合、エラーになるのでしょうか?

私は、トランザクション処理というのは、表操作を行ってからcommitするまでの間をひとくくりとして、その間はロックがかかると認識しています。

どなたかご教授願います。

投稿日時 - 2004-12-27 12:18:46

QNo.1143337

困ってます

質問者が選んだベストアンサー

こんにちは。

試してみれば、すぐにわかってしまうと思いますが・・・、

>>これはcommit前の仮テーブルのupdate処理の最中に行ロックがかかるとうことでしょうか?
はい。

>>ユーザBがupdate後、ユーザAがrollbackを行った場合は、ユーザAとBの行ったupdate処理は、それぞれどうなってしまうのでしょうか?
ユーザーBのUPDATEは、COMMITもROLLBACKもされてない状態です。
ユーザーAのROLLBACKは、何も起こりません・・・。
「ユーザAとBの行ったupdate処理は」←ユーザーAもUPDATE文を発行していたのなら、当然ROLLBACKされますよ(自分だけ)。

>>あと、ユーザAがupdateを行い、commitする前にユーザBはその表に対して参照することはできるのでしょうか?
テーブルの全ての行を参照可能です。
ただしユーザーAがCOMMITするまで、その変更は参照できません(反映されません)。
FOR UPDATEオプションでの参照は、その行を含めた場合は当然無効です。
(^^ゞ

投稿日時 - 2004-12-27 18:04:39

お礼

こんにちわ。

分かりやすい説明ありがとうございます!

>テーブルの全ての行を参照可能です。
>ただしユーザーAがCOMMITするまで、その変更は参照でき>ません(反映されません)。

commit前の処理は表には反映されないんですね。
納得しました!

まだまだ未熟者ですが、また何かありましたらよろしくお願いします!
ありがとうございました。

投稿日時 - 2004-12-27 20:20:12

このQ&Aは役に立ちましたか?

8人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

こんにちは。

>>Oracle以外のDBではそのようなことはできないのでしょうか?
どちらもOracle固有のものです・・・。
ほかのDBでも、それぞれ何らかの機能は提供されてるかも知れませんが、その辺りはわかりません・・・。
(Oracle以外はあんまり詳しくないです、すみません)
将来DBが変更される可能性があるようなアプリケーションの開発には、使用しないほうがいいでしょう。
そもそもMySQLやSQLServerに、子トランザクションという概念があるのかどうかもわかりません・・・。
(サーバー変数は存在してますので、RETURNINGに似たようなものはあると思いますが・・・)
(^^ゞ

投稿日時 - 2004-12-29 11:08:14

お礼

こんにちは。

色々教えて頂きありがとうございました。
Oracle以外にも同様の機能があるか調べてみます。

また何かありましたらご教授ください。
よろしくお願いします。

投稿日時 - 2004-12-29 11:21:59

ANo.4

こんにちは。

>>returning・PRAGMAはSQLのコマンドなのでしょうか?
PL/SQLで使用します。
RETURNINGに関しては、埋め込みで使えたと思いますが、PRAGMAは無理ですね。
何かのプログラム(VBやJAVAなど)でSQLを使用している場合、DECLAREで無名PL/SQLブロックを埋め込んで使用できます。
これが結構便利なんですよ・・・。
(^^ゞ

投稿日時 - 2004-12-29 10:20:54

補足

早速のお返事ありがとうございます!

>PL/SQLで使用します。
ということは、Oracle以外のDBではそのようなことはできないのでしょうか?

投稿日時 - 2004-12-29 10:38:04

ANo.3

こんばんは。

まだ締め切ってないようですので、ちょっと追加を・・・。
自分自身で、あるテーブルをUPDATEした後、COMMITをする前にそのデータを参照(SELECT)した場合、
やっぱり更新結果は反映されてませんよ。
自分でUPDATEしたものをCOMMIT前に取得するには、returningを使います。
全体の処理で一部のSQL文だけをCOMMITしたい場合には、PRAGMAを使用します。
(^^ゞ

投稿日時 - 2004-12-28 19:54:04

補足

お返事ありがとうございます!

>自分でUPDATEしたものをCOMMIT前に取得するには、>>returningを使います。
>全体の処理で一部のSQL文だけをCOMMITしたい場合には、PRAGMAを使用します。

returning・PRAGMAはSQLのコマンドなのでしょうか?

投稿日時 - 2004-12-29 10:03:49

ANo.1

こんにちは。

「Transaction = Lock」じゃないですよ。
Update文を発行した場合、暗黙で行ロックがかかります。
テーブルロックではありません・・・。
(^^ゞ

投稿日時 - 2004-12-27 17:11:57

補足

早速のお返事ありがとうございます。

>Update文を発行した場合、暗黙で行ロックがかかります。
これはcommit前の仮テーブルのupdate処理の最中に行ロックがかかるとうことでしょうか?

また上記質問の補足ですが、
ユーザBがupdate後、ユーザAがrollbackを行った場合は、ユーザAとBの行ったupdate処理は、それぞれどうなってしまうのでしょうか?

あと、ユーザAがupdateを行い、commitする前にユーザBはその表に対して参照することはできるのでしょうか?

よろしくお願いします。

投稿日時 - 2004-12-27 17:38:49

あなたにオススメの質問