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

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2008年 3月 7日 (金) 13:50:53 JST


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