0

Oracle データベースのテーブルに対して挿入クエリを実行しようとしていました。以下は私がやっているテストです。

  1. まず、SQL Developer セッションから挿入したいテーブルをロックします

    lock table RANDOM_TABLE in exclusive mode nowait
    
  2. DbCommand.ExecuteNonQuery を使用して挿入を実行してみてください
  3. 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
4

0 に答える 0