Performance 针对DB2表的性能事务作用域

Performance 针对DB2表的性能事务作用域,performance,entity-framework,db2,transactionscope,mstdc,Performance,Entity Framework,Db2,Transactionscope,Mstdc,我们正在努力找出性能问题的原因 我们有一个包含主键和计数器的单行表。在一个事务中,我们读取计数器的值,将值增加一,然后保存新值 读取和更新是使用实体框架完成的,我们使用可序列化的事务作用域,我们需要确保计数器值只读取一次 大多数情况下,这需要0.1秒,然后有时需要超过1秒。我们还没有找到任何模式来解释为什么会发生这种情况 在使用事务作用域时,是否有其他人体验过可变性能?放弃使用事务作用域并直接在连接上设置事务是否有帮助?我们现在已经解决了这个问题 问题的根源在于DB2提供程序不支持事务升级。这导

我们正在努力找出性能问题的原因

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

读取和更新是使用实体框架完成的,我们使用可序列化的事务作用域,我们需要确保计数器值只读取一次

大多数情况下,这需要0.1秒,然后有时需要超过1秒。我们还没有找到任何模式来解释为什么会发生这种情况


在使用事务作用域时,是否有其他人体验过可变性能?放弃使用事务作用域并直接在连接上设置事务是否有帮助?

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

问题的根源在于DB2提供程序不支持事务升级。这导致事务范围对所有事务使用MSDTC分布式事务

我们用数据库连接上设置的事务替换了事务作用域的使用


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

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

问题的根源在于DB2提供程序不支持事务升级。这导致事务范围对所有事务使用MSDTC分布式事务

我们用数据库连接上设置的事务替换了事务作用域的使用


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

我记得很久以前就对这个问题发表了评论,但最近我所在的商店中的一些开发人员开始使用TransactionScope,并且也遇到了性能问题。在尝试这样做的时候,谷歌的搜索结果显示这一点非常高

我们遇到的问题是,显然,使用链接命令(插入等)在使用时不起作用(至少在我们正在运行的版本上,客户端v9.7.4.4连接到DB2z/OSV10)

我想我会为我们遇到的问题留下一个解决办法(在TransactionScope下运行大量[1k+]插入时性能较慢,但在删除范围并允许链接时运行良好)。我不确定它是否能直接帮助回答最初的问题,但是如果您查看IBM.Data.DB2.dll类,可以使用DB2DataAdapter和底层DataTable更新行,那么这里有一些选项

下面是VB.NET中的一些示例代码:

Private Sub InsertByBulk(表名为字符串,insertCollection为列表(对象))
Dim curTimestamp=日期。现在
使用范围=新事务处理范围
'打开DB2连接的内容可能会有所不同
使用conn=GetDB2Connection()
'从ResultSet获取DataTable的哑查询
Dim sql=String.Format(“从{0}中选择*其中1=0”,tableName)
使用适配器=新的DB2DataAdapter(sql,conn)
使用表作为新数据表
FillSchema(表,SchemaType.Source)
对于insertCollection中的每个项目
Dim row=表。NewRow()
行(“ID”)=项目ID
行(“字符字段”)=item.CharField
行(“数量”)=项目数量
行(“更新时间戳”)=curTimestamp
table.Rows.Add(行)
下一个
使用bc=新的DB2BulkCopy(conn)
bc.DestinationTableName=表名
bc.WriteToServer(表)
结束使用“批量复制”
结束使用“数据表”
结束使用“DataAdapter”
使用“结束”连接
scope.Complete()
终端使用
端接头

我记得很久以前对这个问题发表过评论,但最近我所在的商店中的一些开发人员开始使用TransactionScope,并且遇到了性能问题。在尝试这样做的时候,谷歌的搜索结果显示这一点非常高

我们遇到的问题是,显然,使用链接命令(插入等)在使用时不起作用(至少在我们正在运行的版本上,客户端v9.7.4.4连接到DB2z/OSV10)

我想我会为我们遇到的问题留下一个解决办法(在TransactionScope下运行大量[1k+]插入时性能较慢,但在删除范围并允许链接时运行良好)。我不确定它是否能直接帮助回答最初的问题,但是如果您查看IBM.Data.DB2.dll类,可以使用DB2DataAdapter和底层DataTable更新行,那么这里有一些选项

下面是VB.NET中的一些示例代码:

Private Sub InsertByBulk(表名为字符串,insertCollection为列表(对象))
Dim curTimestamp=日期。现在
使用范围=新事务处理范围
'打开DB2连接的内容可能会有所不同
使用conn=GetDB2Connection()
'从ResultSet获取DataTable的哑查询
Dim sql=String.Format(“从{0}中选择*其中1=0”,tableName)
使用适配器=新的DB2DataAdapter(sql,conn)
使用表作为新数据表
FillSchema(表,SchemaType.Source)
对于insertCollection中的每个项目
Dim row=表。NewRow()
行(“ID”)=项目ID
行(“字符字段”)=item.CharField
行(“数量”)=项目数量
行(“更新时间戳”)=curTimestamp
table.Rows.Add(行)
下一个
使用bc=新的DB2BulkCopy(conn)
bc.DestinationTableName=表名
bc.WriteToServer(表)