1

パフォーマンスの問題の原因を突き止めようとしています。

主キーとカウンターを含む単一行のテーブルがあります。トランザクション内で、カウンターの値を読み取り、値を 1 つ増やして、新しい値を保存します。

読み取りと更新は Entity Framework を使用して行われます。シリアル化可能なトランザクション スコープを使用します。カウンター値が 1 回だけ読み取られるようにする必要があります。

ほとんどの場合、これには 0.1 秒かかりますが、1 秒以上かかることもあります。なぜこれが起こるのかについてのパターンを見つけることができませんでした.

トランザクション スコープを使用しているときに、他の誰かがさまざまなパフォーマンスを経験しましたか? トランザクション スコープを使用して削除し、トランザクションを接続に直接設定すると役立つでしょうか?

4

2 に答える 2

3

ずいぶん前にこの質問についてコメントしたことを覚えていますが、最近、私のショップの何人かの開発者が TransactionScope を使い始め、パフォーマンスの問題にも遭遇しました。いくつかの情報を検索しようとしているときに、これは Google 検索結果のかなり上位に表示されました。

私たちが遭遇した問題は、明らかに、BeginChainを使用したコマンド (INSERT など) のチェーンが、 TransactionScopeを使用している場合に機能しないことでした(少なくとも、実行しているバージョンでは、クライアント v9.7.4.4 は DB2 z/OS v 10 に接続しています)。 )。

私たちが遭遇した問題 (TransactionScope で [1k+] の INSERT を実行するとパフォーマンスが低下するが、スコープを削除して連鎖を許可すると問題なく動作する) の回避策を残しておこうと思いました。元の質問に直接役立つかどうかはよくわかりませんが、DB2DataAdapter と基礎となる DataTable を使用して行を更新できる IBM.Data.DB2.dll クラスを調べると、いくつかのオプションがあります。

VB.NET のコード例を次に示します。

Private Sub InsertByBulk(tableName As String, insertCollection As List(Of Object))
    Dim curTimestamp = Date.Now

    Using scope = New TransactionScope
        'Something that opens a connection to DB2, may vary
        Using conn = GetDB2Connection()
            'Dumb query to get DataTable from the ResultSet
            Dim sql = String.Format("SELECT * FROM {0} WHERE 1=0", tableName)

            Using adapter = New DB2DataAdapter(sql, conn)
                Using table As New DataTable
                    adapter.FillSchema(table, SchemaType.Source)

                    For Each item In insertCollection
                        Dim row = table.NewRow()
                        row("ID") = item.Id
                        row("CHAR_FIELD") = item.CharField
                        row("QUANTITY") = item.Quantity
                        row("UPDATE_TIMESTAMP") = curTimestamp
                        table.Rows.Add(row)
                    Next

                    Using bc = New DB2BulkCopy(conn)
                        bc.DestinationTableName = tableName
                        bc.WriteToServer(table)
                    End Using 'BulkCopy
                End Using 'DataTable
            End Using 'DataAdapter
        End Using 'Connection
        scope.Complete()
    End Using
End Sub
于 2014-03-14T16:36:42.493 に答える
1

これで、この問題は解決しました。

問題の根本は、DB2プロバイダーがトランザクションの昇格をサポートしていないことでした。これにより、すべてにMSDTC分散トランザクションを使用するトランザクションスコープが作成されます。

トランザクションスコープの使用を、データベース接続で設定されたトランザクションに置き換えました。

質問にコードが含まれている複合サービスは、3秒から0.3秒に短縮されました。

于 2012-08-17T11:28:27.783 に答える