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

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

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

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

2回答

3422閲覧

WebAPIでのトランザクションの制御

Zenasp1401

総合スコア10

C#

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2019/06/24 05:09

編集2019/06/24 05:36

以下の様にSQLを発行している既存のアプリのDBAccess部分をhttpに変更しなければならないのですが、トランザクションについてお知恵をお貸しください。

環境は
Windows Server 2016 + IIS
SQLserver2017
開発言語 C#

・既存AP(ローカルのDBへアクセス)
トランザクション開始

SQL.1を発行

SQL.xを発行

コミット

・以下のような事ができるか分かりませんが、希望としては以下の様にしたいです。(Webサーバへのアクセス)
WebAPI_A(httpでトランザクション開始)

WebAPI_B(httpでSQL.1を発行)

WebAPI_C(httpでSQL.xを発行)

WebAPI_D(httpでコミット)

それぞれ別のhttpリクエストでの処理を、一つのトランザクションとして処理することはできるのでしょうか?
WebAPI_A~WebAPI_Dを一つのWebAPIとして再設計し、トランザクションを行うしかないでしょうか。

SQLの内容について追記します。
SQLの内容は複数でSQL.1~SQL.xとなり、内容としては以下のようなパターンがあります。
・ヘッダ情報テーブルと明細情報テーブルへの更新
・複数のテーブルに対し、ステータス情報の更新
・複数のテーブルで一つの取引情報となるテーブルの洗い替え
それぞれ、DBのトランザクション機能を使用するのではなく、更新が失敗した際は、自力でデータを削除するなどするしかないでしょうか。

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

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

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

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

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

guest

回答2

0

SQL1, SQL2 が何か具体的に書いたほうがいいです。

A銀行B支店のCさんの口座から1万円をA銀行D支店Eさんの口座に振込む処理を考えましょう。

  1. トランザクションを開始。
  2. A銀行B支店のCさんの口座から1万円を引き落とす。
  3. A銀行D支店Eさんの口座にら1万円を振込む。
  4. COMMITし、トランザクションを終了する。

ただし、何らかのトラブルが発生した場合はROLLBACKしてリトライ。

Cさんの口座から1万円を引き落としたけど、Eさんの口座に入金されていなかったら信用は台無し。
トランザクションを保証するためにわざわざお金をかけてデータベースを使います。

トランザクションを知ればデータベースがわかる

投稿2019/06/24 05:22

Orlofsky

総合スコア16415

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

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

0

ベストアンサー

WebAPI_A(httpでトランザクション開始)

WebAPI_B(httpでSQL.1を発行)

WebAPI_C(httpでSQL.2を発行)

WebAPI_D(httpでコミット)

トランザクションを開始したプロセスをどうやって維持しておくのか、という問題と、各APIへのアクセスの間にネットワークが切断された場合を考えたら、あんまり現実的じゃないかと。

A,B,C,Dの処理を何らかのキューに入れておいて、Dのタイミングで一気に発行、とかもできなくはないでしょうけど。

既存ロジックを活かしたいから作り変える箇所を最小化したい、というのであれば、ローカルにDBのレプリカを作って、更新した内容を任意のタイミングでリモートと同期する、という方法もなくはないけど、これも同時実行制御(データのマージとか)どうするんだ、という課題があるので、普通に1本のAPIにした方が良いです。(そうしないことのデメリットの方がたぶん大きい)

投稿2019/06/24 05:43

gentaro

総合スコア8949

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

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

Zenasp1401

2019/06/24 06:01

gentaro様のご指摘の通り、仮に方法があったとしても、課題が多そうですね。 1本にまとめる様にしたします。 ありがとうございます。
gentaro

2019/06/24 06:03

おそらくDBとクライアントの2層モデルで作っていたアプリをWEBを介した3層モデルに変更しようとしているけど、トランザクション内にクライアント側のロジックが入り込んでいて分離が難しい、という話だと思いますが、アーキテクチャレベルでの変更なのに小手先の技を駆使してトリッキーな対応をすると、確実に技術的負債になって、トラブルシューティングなど余計なコストがかかると思います。 (実のところ似たような事をしてえらい目にあったプロジェクトをいくつか知ってるので、強く反対したい)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問