最初に
直接プログラムには関係ありませんが、プログラムにつながる内容だと思うため、質問させていただきます。
現状と目標
- 現状
サーバにあるオラクルDBにたいしてクライアント(Windowsアプリ)からOarcleClient(ODP)を使用して、データを取得・更新などしています。
- 目標
DB操作はサーバのみにしたく、また距離や回線によって速度の限界が早いため、WEB化したい。
処理内容やミドルウェアのため、完全なWEBにはできないので、画面はWindowsアプリで通信をWEBにしようと思い、HttpClientを使いJsonでやり取りする方法で考え中です。
問題となる処理内容
メインの処理内容ですが、
0. トランザクションを開始する
0. 対象となるレコードを先入れ先出しでロックをかけ、処理中の間は他クライアントはさわれないようにする
0. 画面で処理を行う
0. データの内容や処理フラグを更新して終了
0. トランザクションをコミットする
当然ですが、更新処理を行わずに画面を閉じたりアプリが強制終了されたりした場合は、ロールバックします。
同じデータを2重で処理するのはNGなのでレコードロックは必須です。
これをRestで実現したいのですが、当然いろいろ問題が生じました。
※そもそもRestの考え方からすると一連の作業というのはできない?
考えてみたこと
トランザクションを開始したりするAPIを用意した場合
- 正常に画面が閉じられたり、更新処理まで行われればいいが、強制終了などされた場合にトランザクションがそのままになってしまう。
- サーバ側で時間を監視し、一定時間たったら勝手にロールバックをしてもいいが、その間データが処理できないのは困る。
- クライアント側で接続を管理するクラスにIDisposableを実装し、Disposeでロールバックを促せば問題ないのか?もしくはデストラクタを使用すれば?
トランザクションをやめて、別でフラグを用意した場合
- サーバで対象レコードをロックして、フラグを処理中に更新してコミット
- クライアントから更新処理が来たらフラグを処理済に更新する
- この方法も同じで異常事態時に処理しなければいけないデータが埋もれてしまう
- データ指定で修正・更新を繰り返すだけであれば、排他解除の機能をつければよいのですが、対象の処理はオペレーション遷移していき時間が限られているため、NGです
Restをやめて、Soapにしてみたらどうか
- 結局同じ問題が生じる気がする
ご回答いただきたいこと
同じような処理をされている場合、どのような処理方法をとられたのか?
もしトランザクションの問題を解決できるコードがあれば教えていただきたいです。(もしくは、サイトのリンクでも助かります)
そもそもRestなどではなくほかの技術でいい方法があれば参考にさせていただきますので、ぜひ教えてください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/02 12:56
2016/11/02 13:15