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

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

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

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

VB.NET

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

Q&A

解決済

2回答

7880閲覧

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

unkei73

総合スコア14

SQL Server

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

VB.NET

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

0グッド

1クリップ

投稿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

1'トランザクション開始 2Dim TOption As New TransactionOptions() 3TOption.IsolationLevel = Transactions.IsolationLevel.ReadCommitted 4TOption.Timeout = TransactionManager.DefaultTimeout 5Using ts As New System.Transactions.TransactionScope(TransactionScopeOption.Required, TOption) 6 7 ・・・ 8 9 'データ取得(ここまでに他のテーブルのデータは取得できている) 10 Dim tableAdapter As New TestDataSetTableAdapters.TestTableAdapter 11 Dim dataTable As New TestDataSetTable.TestDataTable 12 tableAdapter.Fill(dataTable) ←ここでエラー 13 14 ・・・ 15 16 ts.Complete() 17 18End Using 19

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

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

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

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

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

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

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

guest

回答2

0

MS-DTC を利用した自動トランザクションですよね?

DataTable を Fill するという操作のためだけにトランザクションが必要なのですか? アップされたコードには書いてない何か別の操作があってトランザクションが必要なのですか?

そうでなければ TransactionScope は使わないということが解決策になると思うのですが、とりあえずそれは置いといて・・・

エラーメッセージ "トランザクションの状態に対して操作が有効ではありません" でググってみたでしょうか。

以下のような記事がヒットしますが心当たりはありませんか?

トランザクション処理の途中でのエラー
http://dotnet.kiyochan.jp/article/107012427.html

その記事に書いてありますが、アップされていたコードの前にも DB にアクセスする処置があって、そこでも TransactionScope を使っているが、そこで Complete メソッドを書き忘れているということはありませんか?

それに心当たりはないということでしたら、エラーメッセージでググるといくつか参考になりそうな記事が見つかると思いますので、自分でも調べてみてください。

日本語でヒットする記事が少なければ英語 "the operation is not valid for the state of the transaction" でやってみてください。

投稿2017/08/23 08:15

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

unkei73

2017/08/23 08:43

ご回答いただいたComplete メソッドの件とか調べたあげく、何もわからず行き詰まってました。 skuromakuさんの回答からヒントを得て、単に処理時間がかかりすぎてタイムアウトしていただけでした。 お騒がしして申し訳ございませんでした。
退会済みユーザー

退会済みユーザー

2017/08/23 10:11

上のレスではとりあえず置いといた TransactionScope によるトランザクションの必要性はきちんと評価して、必要なければ(ないはず)削除するということもきちんと行うことをお勧めします。
guest

0

ベストアンサー

Transactions.IsolationLevel.ReadCommittedを設定している場合は
ファジーリード、ファントムリードが発生する可能性があります。
http://gyouza-daisuki.hatenablog.com/entry/2013/11/19/150838

問題ないのであれば、Transactions.IsolationLevel.Serializableにしてみてはどうでしょうか

また、タイムアウトが発生している可能性があるのであれば、タイムアウトを伸ばしてみてはどうでしょうか。

投稿2017/08/23 07:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

unkei73

2017/08/23 08:38

タイムアウトのお言葉で気になって調べた所、エラーになる箇所までに時間がかかりすぎて、トランザクションがタイムアウトしていたようです。 単純な原因ででここに質問を上げるのもお恥ずかしい内容でした。 でも、ご助言ありがとうございました。 結果的に解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問