2011年01月10日

LINQ to SQL番外編 - timestamp列とUpdateCheckプロパティ

   このエントリーをはてなブックマークに追加 Clip to Evernote
中断していた「LINQ to SQL番外編」を再開します。

LINQ to SQLでは、楽観的同時実行制御の仕組みが組み込まれています。
たとえば、Customers テーブルの行を更新する場合、LINQ to SQLは
以下のような UPDATE文を発行します。

パラメータ p0, p1, p2... には、変更前の値が渡されます。
このSQLは、他のユーザによって変更されていない場合にだけ、このUPDATE文
が成功することになりますので、他のユーザによる変更有無を把握できるわけです。

LINQ to SQLでは各カラムに規定値として、
UpdateCheck = UpdateCheck.Always
が設定されています。これにより上記SQLのWHERE句で変更チェックが行われることになります。

しかし、すべてのカラムで変更有無のチェックすることは、パフォーマンスに影響することもあります。
なのでもっと単純な方法でこの制御を行いたい場合もあります。

そのような場合で一般的なのは、Timestamp型のカラムをテーブルに追加することです。
Timestamp型がテーブルにあると、O/Rデザイナーはカラム属性のIsVersionプロパティに
Trueが設定されます。これにより、競合の発生の判断に
Timestamp型のカラムのみが利用されることになります。

O/Rデザイナーが付加する属性を以下に示します。(TimeStampという名前のカラムにしています)

また、

この場合のUPDATE文は、

となり、主キーとTimeStampカラムだけが、チェックされる単純なSQL文となります。

最近では、GUIDをカラムに追加して、同様のことを行うこともあるようですが、
LINQ to SQLがサポートしているかどうかまでは、調べきっていません。
ご存知の方がいましたら、コメントいただけると嬉しいです。



 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52112067