@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

複数ページ間でのトランザクション

投稿者投稿内容
hnk
常連さん
会議室デビュー日: 2003/03/19
投稿数: 46
投稿日時: 2005-02-23 09:43
VB.NETにて
あるページ(A)にて、SQLserverに接続し、SqlTransactionにてトランザクションを
かけたまま複数のページを行き来したのち、
あるページ(B)にて、コミット(またはロールバック)したいと思っております。

SqlTransactionをグローバルに参照、設定できるようにすればと思い
下記をトライしましたがだめでした。
・Session変数への格納、Application変数への格納、クッキーへの格納
(失敗または不可能でした)
・モジュール内に宣言しグローバルにもつ
(リダイレクト時に不具合、リンクでは可能でしたが好ましくない)

何かよい方法はあるでしょうか?
よろしくお願いいたします。
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2005-02-23 09:57
引用:

あるページ(A)にて、SQLserverに接続し、SqlTransactionにてトランザクションを
かけたまま複数のページを行き来したのち、
あるページ(B)にて、コミット(またはロールバック)したいと思っております。



どういうコードを書いたのですか?
失敗とはどうなったのですか?

ASP.NETですね。
だとしたら、ページをまたがるトランザクションの設計は、基本的に、私ならしません。

_________________
たつごろー
codeseek
こみゅぷらす
中博俊
ベテラン
会議室デビュー日: 2004/10/17
投稿数: 91
お住まい・勤務地: 大阪市
投稿日時: 2005-02-23 10:04
ASP.NETにおいてそのような設計は出来ません。
更新するタイミングでコネクションを張って、同時実効性を他の手段で確保してください。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-02-23 10:36
引用:

hnkさんの書き込み (2005-02-23 09:43) より:
VB.NETにて
あるページ(A)にて、SQLserverに接続し、SqlTransactionにてトランザクションを
かけたまま複数のページを行き来したのち、
あるページ(B)にて、コミット(またはロールバック)したいと思っております。


普通はやりません。もしページ遷移の途中でコミットもロールバックもする事無くWEBブラウザを閉じてしまったら何が起こるか考えてみてください。タイムアウトが発生するまでそのセッションは占有されたままになるんですよ。セッションプールが使い果たされサービスが停止したり、レコードにロックが掛かったままになる為、他の業務に支障が出るのが落ちです。

_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/
hnk
常連さん
会議室デビュー日: 2003/03/19
投稿数: 46
投稿日時: 2005-02-23 12:47
返信、ありがとうございます。
失敗、不可能の理由は以下の通り ・Session変数への格納⇒シリアル化できない ・Application変数への格納⇒期待以上に残る ・クッキーへの格納⇒文字列しか入らない (コードは特に特別な記述でないの省略します)
なるべく簡単かつ単純にすませようと思いトライしましたが×。

ページをまたいだトランザクションを実施したいのは、
一度キープしたデータを、ある程度保持しておいて、のちにコミットしたいからです。
ただし、キープ中、他人はそこをキープできなくする。
わかりやすくいいかえると、ショッピングカートのように、
あるものを一度キープしたら、コミットはしてなくても在庫は1つ減っている。
購入するまでは、他のページへの行き来は自由
購入ページにてコミット、というようなことです。

トランザクションタイムアウトを短めの時間で設定しておき、さらにsessionendでロールバックするようにと思っていました。
やはり無理があるのでしょうか。何かよい代価案、名案があればと思ってます。
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2005-02-23 12:52
引用:

わかりやすくいいかえると、ショッピングカートのように、
あるものを一度キープしたら、コミットはしてなくても在庫は1つ減っている。


ショッピングカートのテーブルを用意すればいいかも。

_________________
たつごろー
codeseek
こみゅぷらす
Moo
大ベテラン
会議室デビュー日: 2004/04/12
投稿数: 118
お住まい・勤務地: 地球・港
投稿日時: 2005-02-23 13:04
引用:

たつごろーさんの書き込み (2005-02-23 12:52) より:
引用:

わかりやすくいいかえると、ショッピングカートのように、
あるものを一度キープしたら、コミットはしてなくても在庫は1つ減っている。


ショッピングカートのテーブルを用意すればいいかも。


セッション情報をテーブルに持つというような感じですよね。

_________________
ASP/ASP.NETだいすき。 ASP++ by Moo http://moo-asp.net/
日記は ほぼ毎日更新中 http://d.hatena.ne.jp/aspx/
kanai
ベテラン
会議室デビュー日: 2004/09/13
投稿数: 98
投稿日時: 2005-02-23 13:29
引用:

わかりやすくいいかえると、ショッピングカートのように、
あるものを一度キープしたら、コミットはしてなくても在庫は1つ減っている。
購入するまでは、他のページへの行き来は自由
購入ページにてコミット、というようなことです。



このような目的に対して、トランザクションを用いるのは不適切と思います。
誰かにキープされている商品は、その人が購入(Commit)またはキャンセル(Rollback)
するまで、たとえ在庫が豊富にあったとしても他の人はその商品をキープできなくなってしまいます。

また、「在庫が1つ減っている」ことは、当然ですが他の人からは不可視です。

<追記>
すいません、前半部分をよく読んでいませんでした。
「キープしている間は他人はキープできない」でいいのですね。

いずれにしても、トランザクションで実装するよりも、「キープする」「購入する」の
各行為を、それぞれ独立に定義すべきと思います。



[ メッセージ編集済み 編集者: kanai 編集日時 2005-02-23 13:34 ]

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