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

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

新規登録して質問してみよう
ただいま回答率
87.20%
SQL Server

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

解決済

「トランザクションの状態に対して操作が有効ではありません」が発生します

unkei73
unkei73

総合スコア0

SQL Server

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

2回答

0評価

1クリップ

77閲覧

投稿2017/08/23 07:06

###前提・実現したいこと
VB.netで作成したアプリをWindowsサービスで起動しています。
ソケット通信で受信してDB(SQL Server)にデータを登録しています。
DB接続はTableAdapterを使っています。

あるタイミングからデータ取得(Fill)で「トランザクションの状態に対して操作が有効ではありません」という例外エラーが発生するようになりました。
それまでは正常に動作していたのですが、エラーが出始めてからは100%発生しています。

トランザクションはTracsactionScopeを使用していますが、ある特定のテーブルのみで発生します。
そのテーブルのデータ取得までには他のテーブルにも接続していますが、
エラーは発生しません。

どういったことが考えられるでしょうか?

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

場所 System\.Transactions\.TransactionState\.EnlistPromotableSinglePhase\(InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Transaction atomicTransaction\) 場所 System\.Transactions\.Transaction\.EnlistPromotableSinglePhase\(IPromotableSinglePhaseNotification promotableSinglePhaseNotification\) 場所 System\.Data\.SqlClient\.SqlInternalConnection\.EnlistNonNull\(Transaction tx\) 場所 System\.Data\.SqlClient\.SqlInternalConnection\.Enlist\(Transaction tx\) 場所 System\.Data\.SqlClient\.SqlInternalConnectionTds\.Activate\(Transaction transaction\) 場所 System\.Data\.ProviderBase\.DbConnectionInternal\.ActivateConnection\(Transaction transaction\) 場所 System\.Data\.ProviderBase\.DbConnectionPool\.PrepareConnection\(DbConnection owningObject, DbConnectionInternal obj, Transaction transaction\) 場所 System\.Data\.ProviderBase\.DbConnectionPool\.TryGetConnection\(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection\) 場所 System\.Data\.ProviderBase\.DbConnectionPool\.TryGetConnection\(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection\) 場所 System\.Data\.ProviderBase\.DbConnectionFactory\.TryGetConnection\(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection\) 場所 System\.Data\.ProviderBase\.DbConnectionInternal\.TryOpenConnectionInternal\(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions\) 場所 System\.Data\.ProviderBase\.DbConnectionClosed\.TryOpenConnection\(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions\) 場所 System\.Data\.SqlClient\.SqlConnection\.TryOpenInner\(TaskCompletionSource`1 retry\) 場所 System\.Data\.SqlClient\.SqlConnection\.TryOpen\(TaskCompletionSource`1 retry\) 場所 System\.Data\.SqlClient\.SqlConnection\.Open\(\) 場所 System\.Data\.Common\.DbDataAdapter\.FillInternal\(DataSet dataset, DataTable\[\] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior\) 場所 System\.Data\.Common\.DbDataAdapter\.Fill\(DataTable\[\] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior\) 場所 System\.Data\.Common\.DbDataAdapter\.Fill\(DataTable dataTable\) トランザクションの状態に対して操作が有効ではありません

###該当のソースコード

vb

'トランザクション開始 Dim TOption As New TransactionOptions\(\) TOption\.IsolationLevel = Transactions\.IsolationLevel\.ReadCommitted TOption\.Timeout = TransactionManager\.DefaultTimeout Using ts As New System\.Transactions\.TransactionScope\(TransactionScopeOption\.Required, TOption\) ・・・ 'データ取得(ここまでに他のテーブルのデータは取得できている) Dim tableAdapter As New TestDataSetTableAdapters\.TestTableAdapter Dim dataTable As New TestDataSetTable\.TestDataTable tableAdapter\.Fill\(dataTable\) ←ここでエラー ・・・ ts\.Complete\(\) End Using

###試したこと
アプリもテーブル定義も変わってませんが急にエラーとなりました。
DB再起動は本番環境のためできていません。
DB等をテスト環境に復元しても再現はしません。
問題のテーブルはこのアプリしか接続しておらず、ロックが発生しているか
調べましたが、特に原因となりそうなものが見つかりません。
処理が始まってからエラーが発生するまで2分ほどかかっており、
タイムアウトしているようにも思います。

###補足情報(言語/FW/ツール等のバージョンなど)
Windows 2012 Server
SQL Server2012
.Net FrameWork 4.5

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

SQL Server

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。