Oracle データベースのテーブルに対して挿入クエリを実行しようとしていました。以下は私がやっているテストです。
まず、SQL Developer セッションから挿入したいテーブルをロックします
lock table RANDOM_TABLE in exclusive mode nowait
- DbCommand.ExecuteNonQuery を使用して挿入を実行してみてください
- CommandTimeout プロパティを 60 秒に設定しました
60 秒が経過してもコントロールは返されませんでしたが、テーブルのロックを解除すると、挿入が行われ、例外がスローされます。
コマンドのタイムアウトが期限切れになると、.NETは適切に例外をスローしますが、テーブルのロックが解除されるまでネイティブコードから制御が返されませんでした。この状況で無期限の待機を回避するにはどうすればよいですか?
Public Shared Function ExecuteNonQuery(ByVal ConnectionString As String, ByVal factory As DbProviderFactory, ByVal sql As String) As Integer
Dim rowsAffected As Integer = -1
Using conn As DbConnection = factory.CreateConnection
conn.ConnectionString = ConnectionString
conn.Open()
If conn.State.Equals(ConnectionState.Open) Then
Try
'This works
Dim command As DbCommand = conn.CreateCommand
command.CommandText = sql
command.CommandType = CommandType.Text
command.CommandTimeout = 60
'**********This blocks and never returns.
rowsAffected = command.ExecuteNonQuery()
Catch ex As Exception
Debug.Print(ex.Message)
End Try
End If
End Using
Return rowsAffected
End Function