我们正在努力追查性能问题的原因。
我们有一个包含主键和计数器的单行表。在事务中,我们读取计数器的值,将值递增1并保存新值。
使用Entity Framework完成读取和更新,我们使用可序列化的事务范围,我们需要确保只读取一次计数器值。
大部分时间需要0.1秒,有时需要1秒钟。我们未能找到任何关于为什么会发生这种情况的模式。
使用交易范围时,是否还有其他人遇到过可变性能?是否有助于放弃使用事务范围并直接在连接上设置事务?
答案 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秒。