[seasar-dotnet:789] Re: Timestampによる排他制御について

kubo [E-MAIL ADDRESS DELETED]
2008年 3月 7日 (金) 18:01:38 JST


久保です。

>  今後どうするかは、検討してみますが、
>  時刻型は、DBやデータプロバイダごとに切捨処理や丸め処理が
>  異なるのでS2Dao.NET側で対応しにくい部分です。
>  何かいいアイデアがあれば、教えてください。

どうしても日付で排他制御すると、こういった問題が発生するので、
最近はすっかりどのプロジェクトでもバージョンNOでの排他制御をしています。
S2Dao.NETでの対応はちょっと難しいような気がします。

2008/3/7  <[E-MAIL ADDRESS DELETED]>:
> >Oracle側のUPDATE_DTが08-03-07 11:00:50.984000の場合、
>  >UpdateDt.Millisecond=984となっているので一致していると思われるのですが。
>
>  Oracle側のUPDATE_DTに入っているデータが
>  データの登録時に切り捨てられてミリ秒3桁になっているようです。
>  (System.Data.OracleClientだとミリ秒3桁に切り捨てられる?)
>
>  しかし、BookEntityのUpdateDtプロパティのSystem.DateTime型の時刻値の精度は
>  100ナノ秒単位なのでデータが一致していないことになり
>  NotSingleRowUpdatedRuntimeExceptionが発生します。
>
>  ODP.NET(Oracle Data Provider .NET)の場合、
>  100ナノ秒までのデータが入るTIMESTAMP(7)以上を指定すれば
>  時刻値の切捨てが発生しないため、Timestampによる排他制御に成功します。
>
>  また、SQL Serverの場合、
>  SQL Serverのdatetime型の精度は、3.33ミリ秒ですが、
>  データプロバイダ側で時刻値の丸めを吸収しているらしく
>  このような問題は発生しません。
>
>  従って、System.Data.OracleClient固有の問題と思われ
>  現状では、OracleでTimestampによる排他制御を使用する場合、
>  ODP.NETを使用する必要があります。
>  もしくは、VersionNoによる排他制御を使用するとか。
>
>  今後どうするかは、検討してみますが、
>  時刻型は、DBやデータプロバイダごとに切捨処理や丸め処理が
>  異なるのでS2Dao.NET側で対応しにくい部分です。
>  何かいいアイデアがあれば、教えてください。
>
>
>  08/03/07 に Masafumi Teraoka<[E-MAIL ADDRESS DELETED]> さんは書きました:
>
>
> > 宮城さん
>  >
>  > 早速の返信ありがとうございます。
>  > OracleのTimestamp型をTIMESTAMP(9)に変更しましたが、
>  > やはり、NotSingleRowUpdatedRuntimeExceptionが発生します。
>  >
>  > 私が使用しているデータプロバイダはSystem.Data.OracleClientだからでしょうか?
>  >
>  >
>  > ----- Original Message -----
>  > From: <[E-MAIL ADDRESS DELETED]>
>  > To: <[E-MAIL ADDRESS DELETED]>
>  > Sent: Friday, March 07, 2008 11:40 AM
>  > Subject: [seasar-dotnet:786] Re:Timestampによる排他制御について
>  >
>  >
>  > > 宮城です。
>  > >
>  > >> Timestampによる自動排他制御を利用しているのですが、
>  > >> Oracleの排他対象項目をDATE型からTIMESTAMP(6)に変更すると、
>  > >> NotSingleRowUpdatedRuntimeExceptionが発生します。
>  > >
>  > > TIMESTAMP(7)に変更してみてください。
>  > > 寺岡さんの御指摘どおり、ミリ秒のデータが切り捨てられているのが原因と思います。
>  > > 詳しくは、
>  > > http://s2dao.net.seasar.org/ja/entity.html
>  > > 「ODP.NET使用時のTimestampカラムの型」
>  > > の章の参照をお願いします。
>  > >
>  > >> お世話になっております、寺岡と申します。
>  > >>
>  > >> 現在S2Dao.NET 1.3.6を使用させて頂いております。
>  > >>
>  > >> Timestampによる自動排他制御を利用しているのですが、
>  > >> Oracleの排他対象項目をDATE型からTIMESTAMP(6)に変更すると、
>  > >> NotSingleRowUpdatedRuntimeExceptionが発生します。
>  > >>
>  > >> ・BookEntityクラスを作成し、BOOKテーブルにマッピングしています。
>  > >> ・BookEntityで<TimestampProperty("UpdateDt")>属性を使用しUpdateDtを排他対象項目としています。
>  > >> ・UpdateDtはDatetime型です。
>  > >> --DDL
>  > >> CREATE TABLE SQLWIN.BOOK
>  > >> (
>  > >> ID VARCHAR2(2) NOT NULL,
>  > >> NM VARCHAR2(10) NOT NULL,
>  > >> UPDATE_DT TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP,
>  > >> CONSTRAINT PK_BOOK PRIMARY KEY (ID)
>  > >> )
>  > >>
>  > >>
>  > >> ミリ秒単位の不一致で排他エラーが発生しているのかなと思うのですが、
>  > >> Oracle側のUPDATE_DTが08-03-07 11:00:50.984000の場合、
>  > >> UpdateDt.Millisecond=984となっているので一致していると思われるのですが。
>  > >>
>  > >> アドバイスいただけないでしょうか?
>  > >> 宜しくお願い致します。
>  > >>
>  > >> 以上
>  > >> _______________________________________________
>  > >> seasar-dotnet mailing list
>  > >> [E-MAIL ADDRESS DELETED]
>  > >> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>  > >>
>  > > _______________________________________________
>  > > seasar-dotnet mailing list
>  > > [E-MAIL ADDRESS DELETED]
>  > > https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>  > >
>  > _______________________________________________
>  > seasar-dotnet mailing list
>  > [E-MAIL ADDRESS DELETED]
>  > https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>  >
>
>
>  --
>  Ryo Miyagi
>
>
> _______________________________________________
>  seasar-dotnet mailing list
>  [E-MAIL ADDRESS DELETED]
>  https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>


seasar-dotnet メーリングリストの案内