- PR -

リクエストを跨いだトランザクション

1
投稿者投稿内容
YAMAGUCHI
会議室デビュー日: 2002/09/24
投稿数: 4
投稿日時: 2002-09-24 22:34
YAMAGUCHIです。

.NETで比較的複雑なGUIを作られた方いらっしゃいますでしょうか?
ここでの“複雑”は、例えば、一画面内に2つの一覧があって、
片方の一覧からもう一方の一覧へドラッグ&ドロップをするようなGUIです。
さらに、このようなドラッグ&ドロップを数十回してから結果を
一気にデータベースへ反映させるようなものです。

何とかWebアプリケーションとして実現させたいのですが、
そもそもブラウザには荷が重い処理だと思っています。
妥協して、WindowsアプリケーションからAPサーバ上の
Webサービスを呼び出すような形態でデータベースへの
アクセスを行うようにする場合は、トランザクションの
維持をどのようにすべきかわかりません。そもそも
二つ以上のリクエストに跨ったトランザクションと
いうものがWebサービスで実現できるのか不明です。
結局、このような複雑なGUIを持たせる場合には、
Windowsアプリからデータベースへ素直に
直接ADO.NETでアクセスするような2階層型しか
無いのかなぁ、と思っています。

こういったことで悩まれた方いらっしゃいますでしょうか?
小野@どっとねっとふぁん
ぬし
会議室デビュー日: 2001/10/30
投稿数: 402
投稿日時: 2002-09-25 10:20
YAMAGUCHIさんがおっしゃってるような2つの一覧からもう一方の一覧に
データを移動させるようなGUIを作る場合、わたしだったらどうするか
かんがえてみました。

Webアプリで実現するのであれば、移動元の一覧にチェックボックスでも
つけて、チェックされたものをいっきに移動先の一覧にうつすボタンを
作成すると思います。
あと、結果をDBに登録するためのボタンをつくればいいかな、と思います。

Windowsアプリにするなら、確認はしてないですが、ドラッグ&ドロップで
データを移動させることもできそうですね。
この場合、クライアント側でデータ操作をしている間はDataSetにすべての
データの状態を保持し、登録ボタンを押したときにWebサービスを通して
一気にデータをアップロードすればトランザクションの維持なんて
考えなくてよいのではないでしょうか。

まぁ、実現方法はいろいろあると思うので、他に方法がないかいろいろと
考えてみるのがよいかと思います。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2002-09-25 10:55
引用:

YAMAGUCHIさんの書き込み (2002-09-24 22:34) より:
二つ以上のリクエストに跨ったトランザクションと



例えば

トランザクション開始 -> DBからの情報の取得 -> ユーザーの入力待ち -> DBへの情報格納 -> トランザクション終了

……ということでしょうか。
たとえ技術的に可能だとしても、あまり好ましくないフローに思いますが。

似たような処理は、レコードに「更新日時」の項目を設けて

DBからの情報の取得 -> ユーザーの入力待ち -> トランザクション開始 -> 対象レコードの更新日時の取得 -> 更新日時の不変を確認 -> DBへの情報格納 -> トランザクション終了

……という流れで実装したことはあります。

「ユーザーが編集処理を開始したレコードを明示的にロックしたい場合」は
編集開始日時の欄でも作って、一定時間内に編集を開始したレコードに対する
情報取得を制限するとか、そういう実装にすると思います。
#で、編集終了したら編集開始日時にNullでも入れると
YAMAGUCHI
会議室デビュー日: 2002/09/24
投稿数: 4
投稿日時: 2002-09-25 12:53
引用:

永井和彦さんの書き込み (2002-09-25 10:55) より:

「ユーザーが編集処理を開始したレコードを明示的にロックしたい場合」は
編集開始日時の欄でも作って、一定時間内に編集を開始したレコードに対する
情報取得を制限するとか、そういう実装にすると思います。
#で、編集終了したら編集開始日時にNullでも入れると



永井さんの言われたとおり、今回は“明示的にロックしたい”んです。
できればRDBMSの排他制御機能を利用したいです。
しかし、そもそも“WEB系”のアプリケーションで
そんなことができるのでしょうか。セッションに
コネクションオブジェクトを保持しておく方法も無くは無いですが、
無理矢理、な気がします。

#基本的な質問ですが、昔のVB+ORACLEみたいな2階層型システム
であっても、

トランザクション開始 -> DBからの情報の取得(明示的ロック) -> ユーザーの入力待ち -> DBへの情報格納 -> トランザクション終了

のようなフローは好ましくないんですか?
私個人的には別に問題無いかなぁと思っています。
Eins
会議室デビュー日: 2002/09/05
投稿数: 8
投稿日時: 2002-09-25 15:13
引用:

トランザクション開始 -> DBからの情報の取得(明示的ロック) -> ユーザーの入力待ち -> DBへの情報格納 -> トランザクション終了

のようなフローは好ましくないんですか?
私個人的には別に問題無いかなぁと思っています。



どうもEinsです。

明示的にロックということですが
これから推測するに、取得した情報が著しく変化するために取得時からロックを
かけているのでは? と思われるのですが、これに対して著しく変化するデータに対して
かなり長めのロックをかけるのはどうかと思われます。

この推測が間違っていたとしても
上述より数十回のドラッグ&ドロップということですので
最低でも数分のロック時間を要するのではないでしょうか?

システム利用状況、データの編集状況等がわからないので
一概には言えませんけど、あまりロックが長いのは問題があると思われます。

セオリーでは、同時実行性の面から言って極力ロックは短めだと思います。
YAMAGUCHI
会議室デビュー日: 2002/09/24
投稿数: 4
投稿日時: 2002-09-25 15:30
[quote]
Einsさんの書き込み (2002-09-25 15:13) より:
システム利用状況、データの編集状況等がわからないので
一概には言えませんけど、あまりロックが長いのは問題があると思われます。

セオリーでは、同時実行性の面から言って極力ロックは短めだと思います。

[/quote]

.NETから話が離れてしまいましたが、
いずれにしても私自身がトランザクション等の基礎勉強から
やり直したほうがよさそうです。

shuさん、永井さん、Einsさん、ありがとうございました。
また何かありましたら、よろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)