- - PR -
スマートクライアントと排他制御
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-12-06 22:53
毎々お世話になっております。 件名の件、スマートクライアント上で、排他制御を実現しようと 試行錯誤を繰り返しているのですがうまくいかず悩んでいます。 やりたい事は、悲観的排他制御を実現したいと考えています。 手元のマニュアルには、楽観的排他制御に関して記載があるのですが、 悲観的排他制御に関する記載がないもので・・・。 ここでいう悲観的排他制御とは あるテーブルAをユーザの一人がアクセスした時点で 他のユーザはアクセスできない(見れない)と考えてます。 (認識を間違えていたらご教示下さい。) Webサービス側のあるクラスで、 BeginTransactionやOracleConnectionなどを戻り値にしたメゾットを 作成して、トランザクションをクライアント側で管理し テーブルのロックを実現させようとしたのですがうまくいきません。 (戻り値が帰ってこないのです・・・) ここで一つ疑念が沸いたのですが、スマートクライアントでは 悲観的排他制御は不可能なのでしょうか? 宜しくお願いします。 | ||||||||
|
投稿日時: 2005-12-07 01:20
ここからして、悲観的ロック以前の問題なのではないでしょうか? 何故インスタンスが戻らないのか検証する必要があります。 例外が起きているのか、制御フローが意図とズレているのか etc... "Web サービス側" であるにも関わらず、戻り値が返ってこないことをご確認されたようですから、 デバッグをしていないハズがないのですが、実際に何をされたのか見えませんでした。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2005-12-07 07:43
ロック云々を行っているのはあくまでWEBサービスです。スマートクライアント云々はまったく関係ありませんし、出来ないはずはありません。行っている試行錯誤の内容がまったく分からないので、何をしているのか想像も付かないのですが、単に使い方を間違えているだけなのではないかと・・・。 _________________ 甕星 <mikahosi@abox9.so-net.ne.jp> http://blogs.msmvp.jp/mikahosi/ | ||||||||
|
投稿日時: 2005-12-07 19:38
返信ありがとうございます。 「できないはずはない」っと自分でも思っているのですが・・・。 下記に自分が試した事を2つ書き留めます。 データベースはオラクル8です。 記憶で書いていますので、ロジック内のスペルはある程度 無視して頂きたいと思ってます。 勘違いがあればご教示お願いします。 (1) Webサーバの(OracleDB)クラスで private BeginTransaction oraTrans = null ; private OracleConnection oraConn = null ; [WebMethod] public void getBeginTransaction() { this.oraTrans = new BeginTransaction(ISO....なんとか) ; } public void getOracleConnection() { string strConn = AppConfig("XXXXX") ; // Webコンフィグからデータベースの接続先を取得 this.oraConn = new OracleConnection(strConn) ; } [WebMethod] public void getBeginTransaction() { this.oraConn.Open() ; } クライアント側(Windowsアプリ) private webRef.OracleDB webDB = null ; XXXX_Load(.....) { this.webDB = new webRef.OracleDB() ; webDB.getOracleConnection() ; webDB.getOpen() ; // ←ここでエラーが出ます。 webDB.getBeginTransaction() ; } 検索ボタンイベント_Click(.....) { DataSet ds = webDB.getDataSet(sql文) ; //データベースからデータを取得など・・・。 } // 現象としては、 getOpen()の前のgetOracleConnection()は取得できていたので、 OracleDBクラス内でプライベートとして 管理していると思っていました。実際はコネクション情報が getOpen()を呼び出した時点で、NULL情報になっておりエラーとなりました。 (2) webサービス側の(OracleDB)クラスで [WebMethod] public BeginTransaction getBeginTransaction() { BeginTransaction oraTrans = new BeginTransaction(ISO....なんとか) ; return oraTrans ; } これは、ビルド後、ブラウザ上で、http://localhost/XXXX/OracleDB.asmx のURLを指定したらエラー画面となってしまいました。。。。 戻り値が戻ってこないという意味はこちらです。 以上、初心者的な質問ですが宜しくお願いします。 | ||||||||
|
投稿日時: 2005-12-07 20:01
こんにちは。
オブジェクトを作っての呼び出しなので勘違いしそうですが、メソッドを呼ぶたびに違うリクエストですよね? Web サービスの OracleDB は、メソッドを呼ぶ(リクエストする)度に新しく作られています。つまりステートレスです。 Web サービスにセッションを持たせて状態を維持する事もできなくはない「みたい」ですが、素直に、トランザクションオブジェクト、コネクションオブジェクトを返してみてはいかがでしょうか。 _________________ 囚人のジレンマな日々 | ||||||||
|
投稿日時: 2005-12-07 20:09
そりゃ無理ってもんです。 Webサービス呼び出しのセッションをまたがってDBのリソースを扱いたいなら、 無理にでもASP.NETのセッションでもつとか、とにかくサーバ側で維持しないと できません。 いろいろ気にしないといけない問題が多すぎて、とてもお勧めできませんが。 | ||||||||
|
投稿日時: 2005-12-07 20:09
・・・と思ったら、(2)で何かしようとしていますね。失礼しました。
BeginTransaction というクラスが何なのか分からないので何とも言えませんが、中に多分OracleTransaction のインスタンスがあるのでしょう。 で、BeginTransaction のコンストラクタを呼ぶには、多分前提条件があるのでしょう。(それが多分 getOracleConnection() の呼び出し) ぶっちゃけると作りが変です・・・。 _________________ 囚人のジレンマな日々 | ||||||||
|
投稿日時: 2005-12-07 20:14
つっこみありがとうございます。 Web サービスのセッション、コネクションを返す、どちらに対してでしたでしょうか?どちらもですね^^; すみません。無理は承知でした。 できないことはないかなと思いまして^^; _________________ 囚人のジレンマな日々 [ メッセージ編集済み 編集者: 囚人 編集日時 2005-12-07 20:16 ] |