【发布时间】:2009-05-13 04:04:44
【问题描述】:
我遇到了 LINQ2SQL 和事务的主要性能问题。我的代码使用 IDE 生成的 LINQ2SQL 代码执行以下操作:
运行存储过程检查现有记录 如果记录不存在则创建记录 运行将自己的代码包装在事务中的存储过程
当我在没有事务范围的情况下运行代码时,我每秒获得 20 次迭代。一旦我将代码包装在事务范围内,它就会下降到每秒 3-4 次迭代。我不明白为什么在顶层添加事务会大大降低性能。请帮忙?
带有事务的伪存储过程:
begin transaction
update some_table_1;
insert into some_table_2;
commit transaction;
select some, return, values
没有事务的伪 LINQ 代码:
var db = new SomeDbContext();
var exists = db.RecordExists(some arguments);
if (!exists) {
var record = new SomeRecord
{
// Assign property values
};
db.RecordsTable.InsertOnSubmit(record);
db.SubmitChanges();
var result = db.SomeStoredProcWithTransactions();
}
带有事务的伪 LINQ 代码:
var db = new SomeDbContext();
var exists = db.RecordExists(some arguments);
if (!exists) {
using (var ts = new TransactionScope())
{
var record = new SomeRecord
{
// Assign property values
};
db.RecordsTable.InsertOnSubmit(record);
db.SubmitChanges();
var result = db.SomeStoredProcWithTransactions();
ts.Complete();
}
}
我知道交易没有升级到 DTC,因为我已禁用 DTC。 SQL Profiler 显示,在启用事务范围的情况下,一些查询需要更长的时间,但我不确定为什么。所涉及的查询非常短暂,并且我已经验证了正在使用的索引。我无法确定为什么添加父事务会导致性能如此下降。
有什么想法吗?
编辑:
我已将问题追溯到最终存储过程中的以下查询:
if exists
(
select * from entries where
ProfileID = @ProfileID and
Created >= @PeriodStart and
Created < @PeriodEnd
) set @Exists = 1;
如果我有如下图的with(nolock),问题就消失了。
if exists
(
select * from entries with(nolock) where
ProfileID = @ProfileID and
Created >= @PeriodStart and
Created < @PeriodEnd
) set @Exists = 1;
但是,我担心这样做可能会导致问题发生。有什么建议吗?
【问题讨论】:
标签: c# linq-to-sql