针对DB2表的性能事务范围

时间:2012-08-06 13:10:14

标签: performance entity-framework db2 transactionscope mstdc

我们正在努力追查性能问题的原因。

我们有一个包含主键和计数器的单行表。在事务中,我们读取计数器的值,将值递增1并保存新值。

使用Entity Framework完成读取和更新,我们使用可序列化的事务范围,我们需要确保只读取一次计数器值。

大部分时间需要0.1秒,有时需要1秒钟。我们未能找到任何关于为什么会发生这种情况的模式。

使用交易范围时,是否还有其他人遇到过可变性能?是否有助于放弃使用事务范围并直接在连接上设置事务?

2 个答案:

答案 0 :(得分:2)

我记得很久以前对这个问题的评论,但最近我店里的一些开发人员已经开始使用TransactionScope,并且还遇到了性能问题。尝试search for some information时,谷歌搜索结果中出现了相当高的数据。

我们遇到的问题是,当使用BeginChain时,显然用TransactionScope链接命令(INSERT等)不起作用(至少在我们运行的版本Client v9上)。 7.4.4连接到DB2 z / OS v 10)。

我认为我会为遇到的问题留下一个解决方法(在TransactionScope下运行大量[1k +] INSERT时效果会很慢,但在删除范围并允许链接时运行正常)。我不确定它是否会直接帮助原始问题,但是如果查看允许使用DB2DataAdapter和基础DataTable更新行的IBM.Data.DB2.dll类,则有一些选项。 / p>

这是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

答案 1 :(得分:0)

我们现在已经解决了这个问题。

问题的根源是DB2提供程序不支持事务提升。这导致事务范围使用MSDTC分布式事务处理所有内容。

我们将交易范围的使用替换为在数据库连接上设置的交易。

包含问题代码的复合服务从3秒减少到0.3秒。