タイムスタンプを用いた楽観ロックのチェックについて

360 views
Skip to first unread message

sadanori.ogawa

unread,
Jan 9, 2019, 5:40:20 AM1/9/19
to OpenTouryoProject
お世話になります。

D層自動生成ツールにて自動生成し、楽観ロックのチェックを実装したいと考えておりますがDBからのデータ取得時にミリ秒がロストしてしまい困っております。

DB上の型は【datetime】を使用しており、SSMSからはミリ秒まで参照できております。
また、実際に流れるSQLを実行してもミリ秒まで参照できております。

ソースコード上では【ExecSelectFill_DT】を使用しています。
デバッグで止めてみてdatatableの中身を見ましたが、秒までが読み取れ、ミリ秒は読み取れませんでした。

この結果だとは思うのですが、更新時に楽観ロックエラーとなってしまいます。

対象のカラムに対し、CONVERT(CHAR,UPDATE_DATETIME, 21)とSQLを変更すればミリ秒取れているようなのですが、せっかくの自動生成ツールをにも関わらず
自前で修正が必要とは思えません。

どのような対応を行えばよいのかご教授願えませんでしょうか?

一点だけ気になることとしては
D層自動生成ツールのステップ2において、その他の設定で更新方法は空にしています。

nishi.74322014

unread,
Jan 9, 2019, 10:26:48 PM1/9/19
to OpenTouryoProject
ogawaさん

今確認しました。コレから回答作成します。

西野

2019年1月9日水曜日 19時40分20秒 UTC+9 sadanori.ogawa:

nishi.74322014

unread,
Jan 9, 2019, 10:59:11 PM1/9/19
to OpenTouryoProject
ogawaさん

>CONVERT(CHAR,UPDATE_DATETIME, 21)

ということで、恐らく、SQL Serverを使用されていると思いますが、
先ず、「更新方法は空」とありますが、「空」の場合は、手動設定か、
「SQL Serverのtimestamp型のような自動更新型」の利用を想定しています。

上記のtimestampなどの自動更新型以外を使用する場合、
任意のRDBMSデータ型を楽観排他列に使用できます。
その際に「更新方法」を明示して下さい。

サンプルでは、RAND()を使用していたりしますが、
時間や乱数など楽観排他に使用できればなんでもイイです。

なお、本件の問題は以下に起因しているようで、

- DATETIME データ型のミリ秒に関する注意事項 – Microsoft SQL Server Japan Support Team Blog

この場合は、datetime ではなく 
datetime2 または datetimeoffset を使用すると良いようです。

また、あまりお勧めではないですが、
DataRowVersion.Originalを使用した
全列比較の楽観方式と言うものもあり、
これを使用すれば、タイムスタンプ相当列は不要です。

西野


2019年1月10日木曜日 12時26分48秒 UTC+9 nishi.74322014:

sadanori.ogawa

unread,
Jan 10, 2019, 12:41:57 AM1/10/19
to OpenTouryoProject
西野さん

お世話になります。小川です。

回答ありがとうございます。

こちらの質問も悪く申し訳ございません。おっしゃる通りSQLServerを使用しております。
DB上ミリ秒まで保持しているdatetime型のカラム値(2019/01/09 16:18:41.123)が
ExecSelectFill_DTを使用してdatatableに格納すると秒までは保持されており、ミリ秒がロスト(2019/01/09 16:18:41)しているようなのです。
ですので、datetime型のミリ秒に関するまるめとは違っているのかと思っております。

更新方法に関する値の設定や、datetime2型の利用など情報は助かります。
もう少し試してみます。

2019年1月10日木曜日 12時59分11秒 UTC+9 nishi.74322014:

sadanori.ogawa

unread,
Jan 10, 2019, 7:26:28 PM1/10/19
to OpenTouryoProject
西野さん

お世話になります。小川です。

本件、ソースコード上の問題でフレームワークは問題ありませんでした。

デバッグ時にはVSに付属しているdatasetビューワなるものでデータを検証したところミリ秒が落ちていたもので惑わされました。

お騒がせしました。

2019年1月9日水曜日 19時40分20秒 UTC+9 sadanori.ogawa:

nishi.74322014

unread,
Jan 11, 2019, 2:17:12 AM1/11/19
to OpenTouryoProject
小川さん

引き続きよろしくお願いします。

西野

2019年1月11日金曜日 9時26分28秒 UTC+9 sadanori.ogawa:
Reply all
Reply to author
Forward
0 new messages