[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 メーリングリストの案内