質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

SOAP

SOAP(Simple Object Access Protocol)はウェブサービス実装においての構造化された情報をやり取りするためのプロトコル規定です。

トランザクション

トランザクションとは、関連・依存する処理を一連の不可分な処理単位として扱う処理方式を指します。トランザクションとして管理された処理は「すべて成功」か「すべて失敗」のいずれかであることが保証される。処理に失敗した場合は、一連の処理がロールバックされます。

Q&A

1回答

4181閲覧

クラサバをWEB化するにあたり、トランザクションの管理方法

randr

総合スコア202

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

SOAP

SOAP(Simple Object Access Protocol)はウェブサービス実装においての構造化された情報をやり取りするためのプロトコル規定です。

トランザクション

トランザクションとは、関連・依存する処理を一連の不可分な処理単位として扱う処理方式を指します。トランザクションとして管理された処理は「すべて成功」か「すべて失敗」のいずれかであることが保証される。処理に失敗した場合は、一連の処理がロールバックされます。

0グッド

3クリップ

投稿2016/11/02 12:37

最初に

直接プログラムには関係ありませんが、プログラムにつながる内容だと思うため、質問させていただきます。

現状と目標

  • 現状

サーバにあるオラクル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などではなくほかの技術でいい方法があれば参考にさせていただきますので、ぜひ教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

そもそも論として、「ユーザーの編集中にトランザクションを開きっぱなしにする」という設計自体がよろしくないのではないかと思います。トランザクションはデータベース内の複数データ間での一貫性を保つためのものであって、それが排他制御になるのは結果に過ぎません。

リンク自体が断続的にしか確立しないような環境下でユーザーの編集が他者とかち合っていないかを見るには、「編集開始時点で最終更新時間を記録しておく」→「登録時に最終更新が進んでいないか確認」というような、「楽観的並行性制御」によるのがいいのではないかと思います。

投稿2016/11/02 12:45

maisumakun

総合スコア145123

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

randr

2016/11/02 12:56

早いご回答ありがとうございます。 マスタなどであればその方法も考えたのですが、基本的には先入れ先出しで、最終的には電文を作成して外部ホストに送信します。 処理対象データは大量で、1データの処理項目も多く、さらに時間との闘いでもあるため、開いてデータを入力して、最後に更新しようとしたときに「更新できませんでした」では不都合なのです。
maisumakun

2016/11/02 13:15

となると、間欠的な(ページ遷移でしかデータが流れない)HTTP通信ではうまくいかないと思いますので、「ロックセッションをWebSocketで持つ」、あるいは「ロックの寿命を30秒程度にしておいて、入力画面からは10秒おきにJavaScriptでロック延長のリクエストを投げる」というような感じのことを考えてみました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問