アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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

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

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

A 回答 (5件)

こんにちは。



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

>>これは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オプションでの参照は、その行を含めた場合は当然無効です。
(^^ゞ
    • good
    • 0
この回答へのお礼

こんにちわ。

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

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

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

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

お礼日時:2004/12/27 20:20

こんにちは。



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

こんにちは。

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

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

お礼日時:2004/12/29 11:21

こんにちは。



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

この回答への補足

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

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

補足日時:2004/12/29 10:38
    • good
    • 0

こんばんは。



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

この回答への補足

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

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

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

補足日時:2004/12/29 10:03
    • good
    • 0

こんにちは。



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

この回答への補足

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

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

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

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

よろしくお願いします。

補足日時:2004/12/27 17:38
    • good
    • 0

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

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