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

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

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

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

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

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

3回答

5065閲覧

トランザクションを利用した状態で関数を呼びだし、データベースにアクセスしたい

tkta

総合スコア21

Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

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

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

1クリップ

投稿2019/05/10 07:52

編集2019/05/10 08:01

前提・実現したいこと

トランザクションを利用した状態で、
SQLServerにデータを登録し、関数を呼び出して検証を行い、
問題がなければSQLServerに登録したデータをDb2に登録したいです。
データの安全性を担保するため、エラーの場合、Rollback()で一括して更新前に戻したいです。
なお、呼び出した関数からSQLServerにアクセスする際データの参照のみで登録や更新は行わないです。

発生している問題・エラーメッセージ

トランザクションを利用して関数を呼び出したとき、
その関数からSQLServerにアクセスすると、タイムアウトが発生してしまいます。

該当のソースコード

//Entity Frameworkを利用してSQLServerにアクセスしています private DB_Entities db = new DB_Entities(); using (DbContextTransaction tran = db.Database.BeginTransaction()) { try {   //SQLServerにデータを登録・削除・更新する処理    ⋮    //上記の内容を保存します    db.SavesChange();    //DB2に登録する関数    DB2func(db);   //全ての処理がうまくいった場合のみコミットします   tran.Commit(); }catch{    //どこかでエラーが起きたらロールバックします   tran.Rollback(); } }
function DB2func(DB_Entities db){   try{     //ここでタイムアウトが発生してしまします。     var LIST_ITEM = db.TABLE_ITEM.ToLIST();      //DB2に登録する処理      ⋮    }catch{     //登録したDB2の内容を削除する      throw new Exception("エラー")    } }

試したこと

トランザクションを外したら問題なく最後まで動くのですが…。
エラーが起きた際の対応を考えたら、トランザクションを外さずどうにかしたいです。

補足情報(FW/ツールのバージョンなど)

Visual Studio2013
よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

トランザクションはSQLSERVERのものですよね。
であれば、リンクサーバーを経由してDB2にアクセスしているのでしょうか?
そうであれば、リンクサーバーのタイムアウトを増分若しくは無制限にしてみるとか。

若しくは(詳しくないのでアドバイスはできませんが)、分散トランザクションが関係しているかもしれませんね

投稿2019/05/10 08:10

sazi

総合スコア25138

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

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

hihijiji

2019/05/10 08:16

コード上は分散トランザクションを使ってませんね。
tkta

2019/05/10 08:26

SQLServerのリンクサーバーを使用して、DB2に接続していません。 DB2にアクセスする前に、SQLServerにアクセスしようとした時点で、動かなくなります。 トランザクションを外せば動くので、トランザクションが原因でアクセスできないのか、参照型値型の問題なのか、その他のものが原因か、自分の技術じゃ特定の仕方がわからないというのが現状です。 ご回答いただきありがとうございます。
hihijiji

2019/05/10 08:31

ひょっとしてDb2ってIBMのDB2じゃなくて、Db2って名前のSQL Server のテーブルかなにかですか?
tkta

2019/05/10 08:34

いや、IBMのDb2で合ってます。
sazi

2019/05/10 09:18

リンクサーバーを使用していないなら、コネクションは別ですよね。 当然トランザクションも別になるので、DB2側へのコネクションでのトランザクション制御じゃないと駄目だと思います。
hihijiji

2019/05/10 09:48

//DB2に登録する処理 でトランザクションに類することをやっているってことではないでしょうか? 本題に戻ると、トランザクションでタイムアウトなら単純にメモリ不足で時間がかかっているだけかもしれません。
sazi

2019/05/10 10:02

DB_Entities dbがコネクションのように見えるので、同じコネクションでやっているように見えるんですよね。 そもそもエラー自体がSQLSERVERにアクセスしようとして不備が発生すると言われてますし。
sazi

2019/05/10 10:04

DB_Entities dbがDB2へのコネクションなら、そのコネクション上でSQLSERVERにアクセスできるはずもなく、タイムアウトという落ちかもしれません。
tkta

2019/05/13 01:30

解決したのですがDB2へ接続する前に、トランザクション中に別ファイルの関数を呼び出し、そこからSQLServerに接続する際、アクセスができないようでした。 DB_Entities dbは、SQLServerへの接続でした。 ご回答いただきありがとうございます。
guest

0

タイムアウトまでの時間を延ばしてみたらどうでしょうか。

(小ネタ)Entity Framework でタイムアウトの設定方法まとめ

投稿2019/05/10 08:00

Zuishin

総合スコア28656

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

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

tkta

2019/05/10 08:21

タイムアウトを2分にしてみたのですが、 2分後にエラーが投げ返ってくるだけでした。 ご回答ありがとうございます。
Zuishin

2019/05/10 08:34

DB2func はデータを取得しているだけなので、トランザクションに含める必要はないと思います。Commit の後ろに持って行ってはどうでしょう?
tkta

2019/05/10 08:40

DB2funcでDb2にデータを登録しています。 ここでエラーが起きた場合、Db2に登録したデータ、SQLServerに登録・更新・削除したデータを元に戻したいのです。 SQLServerの内容のみを一度コミットしてしまうと、Db2登録時にエラーが起きた際、SQLServerのデータを元に戻せなくなってしまいまして。。。 ご回答いただきありがとうございます。
tkta

2019/05/13 01:34 編集

上記のようなトランザクション方法があるのですね。初めて知りました。 Entity Frameworkの環境等を調べつつも将来的に使用してみたいと思います。 ご回答いただきありがとうございます。
guest

0

自己解決

自己解決しました
呼び出された関数の方で、var db = new DB_Entities();
と宣言しておき、
引数で受け取ったdbをthis.db = dbと入れなおしたら動きました。
遅延実行で呼び出していると思われるので、DBの容量増加等に伴い、動かなくなってしまうということはないと信じます...

説明下手で申し訳ございませんでしたが、
皆様ご回答いただきありがとうございました

投稿2019/05/13 01:36

tkta

総合スコア21

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問