2009年8月28日金曜日

[S2JDBC]排他制御について

いづのです。

現在のS2JDBCのVersionカラムの仕様だと以下のような操作に対して、排他制御が無効になってしまいます。

1.新規レコードを作成
2.そのレコードをAとBの画面で表示。
3.A画面でレコードを物理削除
4.A画面で同じキーで新規レコードを作成
5.B画面で更新

S2JDBCとしてはこのような操作に対する排他制御は現在の仕様上対応出来ないと思っていますが、それは正しいでしょうか。


その場合、現在以下のような対応方法を検討しています。
・Versionカラムを日付型に対応するよう拡張する
・S2JDBCをやめる⇒S2Daoに乗り換え

他になにか良い方法ないでしょうか

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

ひがです。

主キーを代理キー(@GeneratedValue)を使うようにするのが、
一番簡単だと思います。

ビジネスキーを主キーにするのは、レガシーマイグレーション以外では
お勧めしません。

3,4の操作は、普通は、更新でやると思うのですが、
このようなホストっぽい操作をするときは
1の後にダミーで一回更新することで、
versionが更新されるので、5で排他エラーになります。

*サロゲートキー
データベーステーブルの主キーとして導入された、ビジネス上の意味を持たない、連番などのキー。



ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
いづのです。

> 主キーを代理キー(@GeneratedValue)を使うようにするのが、
> 一番簡単だと思います。
>
> ビジネスキーを主キーにするのは、レガシーマイグレーション以外では
> お勧めしません。

今回はそのレガシーマイグレーションなんです。

> 3,4の操作は、普通は、更新でやると思うのですが、
> このようなホストっぽい操作をするときは
> 1の後にダミーで一回更新することで、
> versionが更新されるので、5で排他エラーになります。

排他制御用のカラムに日付をサポートしていないのは、恐らくサロゲートキーがあるからだと思ってました。
やっぱりそうですね。

ではサロゲートキーを使用していない場合、以下のケースでは排他制御は無理ということですよね。

>1.新規レコードを作成
>2.そのレコードをAとBの画面で表示。
>3.A画面でレコードを物理削除
>4.A画面で同じキーで新規レコードを作成
>5.B画面で更新

なにか対処方があればヒントをいただけるとありがたいです。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

ひがです。

> いづのです。
>
> ではサロゲートキーを使用していない場合、以下のケースでは排他制御は無理ということですよね。
>
> >1.新規レコードを作成
> >2.そのレコードをAとBの画面で表示。
> >3.A画面でレコードを物理削除
> >4.A画面で同じキーで新規レコードを作成
> >5.B画面で更新
>
> なにか対処方があればヒントをいただけるとありがたいです。

今回、@VersionでTimestampサポートも必要だということがわかりました。
S2JDBC自体でTimestampサポートを検討したいと思います。

ただ、次のバージョンが出るのは、来年の初めだと思うので、
それまで待てない場合は、ご面倒をおかけしますが、
S2JDBCを独自に拡張してください。

よろしくお願いします。

ひがです。

> いづのです。
>
> ではサロゲートキーを使用していない場合、以下のケースでは排他制御は無理ということですよね。
>
> >1.新規レコードを作成
> >2.そのレコードをAとBの画面で表示。
> >3.A画面でレコードを物理削除
> >4.A画面で同じキーで新規レコードを作成
> >5.B画面で更新
>
> なにか対処方があればヒントをいただけるとありがたいです。

今回、@VersionでTimestampサポートも必要だということがわかりました。
S2JDBC自体でTimestampサポートを検討したいと思います。

ただ、次のバージョンが出るのは、来年の初めだと思うので、
それまで待てない場合は、ご面倒をおかけしますが、
S2JDBCを独自に拡張してください。

よろしくお願いします。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

小林 (koichik) です.

Date: Wed, 17 Dec 2008 13:02:48 +0900
From: "IZUNO Tadashi" <[E-MAIL ADDRESS DELETED]>
To: [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:16522] Re: [S2JDBC] 排他制御について

> ではサロゲートキーを使用していない場合、以下のケースでは排他制御は無理ということですよね。
>
> >1.新規レコードを作成
> >2.そのレコードをAとBの画面で表示。
> >3.A画面でレコードを物理削除
> >4.A画面で同じキーで新規レコードを作成
> >5.B画面で更新
>
> なにか対処方があればヒントをいただけるとありがたいです。

insert するエンティティのバージョンカラムに
タイムスタンプ (long 値) を設定すればよいかと.

Entity e = new Entity();
e.version = System.currentTimeMillis();
...
jdbcManager.insert(e).execute();

version フィールドの初期値をタイムスタンプに
してしまってもいいかも.

public class Entity {
...
@Version
public Long version = System.currentTimeMillis();
}

insert 時,version プロパティの値が null または
0 以下の場合は初期値として 1 が設定されますが,
1 以上の場合はそれがそのまま version カラムの
初期値になります.

Date: Wed, 17 Dec 2008 13:54:05 +0900
From: Yasuo Higa <[E-MAIL ADDRESS DELETED]>
To: [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:16523] Re: [S2JDBC] 排他制御について

> 今回、@VersionでTimestampサポートも必要だということがわかりました。
> S2JDBC自体でTimestampサポートを検討したいと思います。

Timestamp 型をサポートしなくても大丈夫じゃ
ないかなー.

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

0 件のコメント:

マイブログ リスト


Jang ki hote

自己紹介