- PR -

スマートクライアントと排他制御

投稿者投稿内容
さく
ベテラン
会議室デビュー日: 2004/06/11
投稿数: 74
投稿日時: 2005-12-06 22:53

毎々お世話になっております。

件名の件、スマートクライアント上で、排他制御を実現しようと
試行錯誤を繰り返しているのですがうまくいかず悩んでいます。

やりたい事は、悲観的排他制御を実現したいと考えています。
手元のマニュアルには、楽観的排他制御に関して記載があるのですが、
悲観的排他制御に関する記載がないもので・・・。

ここでいう悲観的排他制御とは
あるテーブルAをユーザの一人がアクセスした時点で
他のユーザはアクセスできない(見れない)と考えてます。
(認識を間違えていたらご教示下さい。)

Webサービス側のあるクラスで、
BeginTransactionやOracleConnectionなどを戻り値にしたメゾットを
作成して、トランザクションをクライアント側で管理し
テーブルのロックを実現させようとしたのですがうまくいきません。
(戻り値が帰ってこないのです・・・)

ここで一つ疑念が沸いたのですが、スマートクライアントでは
悲観的排他制御は不可能なのでしょうか?

宜しくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-07 01:20
引用:

さくさんの書き込み (2005-12-06 22:53) より:

(戻り値が帰ってこないのです・・・)


ここからして、悲観的ロック以前の問題なのではないでしょうか?
何故インスタンスが戻らないのか検証する必要があります。
例外が起きているのか、制御フローが意図とズレているのか etc...

"Web サービス側" であるにも関わらず、戻り値が返ってこないことをご確認されたようですから、
デバッグをしていないハズがないのですが、実際に何をされたのか見えませんでした。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-12-07 07:43
引用:

さくさんの書き込み (2005-12-06 22:53) より:
ここで一つ疑念が沸いたのですが、スマートクライアントでは
悲観的排他制御は不可能なのでしょうか?


ロック云々を行っているのはあくまでWEBサービスです。スマートクライアント云々はまったく関係ありませんし、出来ないはずはありません。行っている試行錯誤の内容がまったく分からないので、何をしているのか想像も付かないのですが、単に使い方を間違えているだけなのではないかと・・・。

_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/
さく
ベテラン
会議室デビュー日: 2004/06/11
投稿数: 74
投稿日時: 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/08/13
投稿数: 1019
投稿日時: 2005-12-07 20:01
こんにちは。

引用:

this.webDB = new webRef.OracleDB() ;
webDB.getOracleConnection() ;
webDB.getOpen() ; // ←ここでエラーが出ます。
webDB.getBeginTransaction() ;



オブジェクトを作っての呼び出しなので勘違いしそうですが、メソッドを呼ぶたびに違うリクエストですよね?
Web サービスの OracleDB は、メソッドを呼ぶ(リクエストする)度に新しく作られています。つまりステートレスです。
Web サービスにセッションを持たせて状態を維持する事もできなくはない「みたい」ですが、素直に、トランザクションオブジェクト、コネクションオブジェクトを返してみてはいかがでしょうか。


_________________
囚人のジレンマな日々
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2005-12-07 20:09
引用:

囚人さんの書き込み (2005-12-07 20:01) より:
Web サービスにセッションを持たせて状態を維持する事もできなくはない「みたい」ですが、素直に、トランザクションオブジェクト、コネクションオブジェクトを返してみてはいかがでしょうか。


そりゃ無理ってもんです。
Webサービス呼び出しのセッションをまたがってDBのリソースを扱いたいなら、
無理にでもASP.NETのセッションでもつとか、とにかくサーバ側で維持しないと
できません。

いろいろ気にしないといけない問題が多すぎて、とてもお勧めできませんが。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-12-07 20:09
・・・と思ったら、(2)で何かしようとしていますね。失礼しました。

BeginTransaction というクラスが何なのか分からないので何とも言えませんが、中に多分OracleTransaction のインスタンスがあるのでしょう。
で、BeginTransaction のコンストラクタを呼ぶには、多分前提条件があるのでしょう。(それが多分 getOracleConnection() の呼び出し)

ぶっちゃけると作りが変です・・・。
_________________
囚人のジレンマな日々
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-12-07 20:14
引用:

なちゃさんの書き込み (2005-12-07 20:09) より:
引用:

囚人さんの書き込み (2005-12-07 20:01) より:
Web サービスにセッションを持たせて状態を維持する事もできなくはない「みたい」ですが、素直に、トランザクションオブジェクト、コネクションオブジェクトを返してみてはいかがでしょうか。


そりゃ無理ってもんです。


つっこみありがとうございます。
Web サービスのセッション、コネクションを返す、どちらに対してでしたでしょうか?どちらもですね^^;
すみません。無理は承知でした。
できないことはないかなと思いまして^^;

_________________
囚人のジレンマな日々

[ メッセージ編集済み 編集者: 囚人 編集日時 2005-12-07 20:16 ]

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