IT技術Labo - HouseTect

Javaフリーエンジニアとしての苦悩や、アーキテクトになるための努力の軌跡を掲載しています。.NETとJavaに力を入れた技術情報発信ブログです。

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

トランザクション内でのDML処理は自動でロックを取得している


1トランザクション内でUPDATEなどのDMLを実行し、
さらに同じトランザクションで同じレコードをUPDATEするような場合があるだろう。

例:
▼トランザクション開始
①KUBUN = '1'

処理によって
②KUBUN = '2'
▲トランザクション終了

しかも、ロックなどの処理が以下のような場合

★前処理で排他シーケンスを取得する。(※1)

▼トランザクション開始

・1回目のUPDATE
 →排他シーケンスを見る。
 →同じだったら、ダレも更新していないので、自分が更新する。

・2回目のUPDATE(1回目と同レコード)
 →排他シーケンスを見ないで更新。

▲トランザクション終了


排他シーケンスのような連番をロック用に指定していて、
誰かが更新していたら排他シーケンスがインクリメントされているような処理を行っていた場合、

上記でKUBUNを1にして、その後にKUBUNを2に変更するこの間でダレかが更新していたらどうだろう。

ダレかが更新したレコードに対して、さらに2回目のUPDATEで上書きしてしまう。

なんてことを1時間ほど考えていたら、OracleではUPDATEなどのDMLが実行されたら、
Commitされるまでそのレコードのロックを取得しているので、他の人は更新かけられないことを思い出した!笑
でもこうやっていろいろ考えるのもまた大切なのかもしれない。


※1 排他シーケンスとは?

ここでは単純に例だが、更新処理のときの楽観ロックとして、日付を見るのが基本だが、
たまに、このようなどんどんインクリメントしていくシーケンシャルなカラムを使用する場合がある。
スポンサーサイト

COMMENT

Name
E-mail
URL
Comment
Pass  *
Secret? (管理者にだけ表示)

Pickup Link!

COUNTER



RSSの登録はこちらからどうぞ。
RSS

ブログ内の検索

Google

プロフィール

Hisasann

Author:Hisasann
かなり走り書きなブログで申し訳ないです。個人のメモ程度に使っていますが、よかったら参考にしてくださいね。メールまってま~す。

相互リンク募集しています。 下記メアドまでメールください。
Rastaman@Mixi
Rastaman@コトノハ
Rastaman@テクノラティ

アクセスランキング

ブログパーツ

ブログランキング



ブロとも申請フォーム


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。