中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

業務用ロックテーブル

SQLのお話

ある一瞬のデータを取得したいと思ったらSELECTするだけですが、INSERTさせないようにしたいと思ったことはありませんか?

基本のロックシステムではINSERTをとめようと思ったらそれこそテーブルロックを行うしかありません。

情報テーブル
ユーザID
スレッドID

このようなテーブルがあるとします。何か情報があるとINSERTまたはUPDATEすることにより情報は更新されていきます。

ただこの情報をユーザ単位に洗い替えを行いたいというときにはどうすればいいのでしょうか?

Oracle:Lock Table "情報テーブル"
SQL Server: delete [dbo].[情報テーブル] with ( tablockx )  where ユーザID = 1

ただしこれではテーブル丸ごとロックされてしまう。

粒度としてはユーザ指定までだけに抑えたい。

ではどうするか?

情報テーブルロックテーブル
ユーザID

を作って

Oracle:SELECT * FROM "情報テーブルロックテーブル" where ユーザID = 1 FOR UPDATE
SQL Server: UPDATE delete [dbo].[情報テーブルロックテーブル] with ( UPDLOCK ) SET ユーザID = ユーザID  where ユーザID = 1

という具合にそのテーブルにロックしてしまう。

これであれば、すくなくとも情報テーブルへの更新アクセスはシリアル化され、しかも業務的に制御可能になる。

#SQLレベルの実現方法がこんなに違うのに、SqlConnection, SqlCommandだけファクトリで取り出せたって仕方ないでしょ?
#Oracleは環境を持っていないのでなんとなくで書いているので間違っていたら指摘してください。
#ロックしている事実には代わりは無いので一瞬でも速くトランザクションは開放しましょう。
#当然シリアル化しているので同じユーザIDでのトランザクション流入量が多くなると悲しくなれます。

投稿日時 : 2006年9月3日 1:38

コメントを追加

# thanks for the postmishertAtroro 2010/11/08 20:34 veterinary

Wow this is a great resource.. I’m enjoying it.. good article

タイトル
名前
URL
コメント