2009-12-06 38 views
3

我想补充一个数据库,在这种情况下海量的信息,没有交易在我的LINQ To SQL模型。有谁知道如何关闭数据上下文或提交更改操作上的LINQ to SQL事务?如何禁用LINQ to Sql事务?

回答

2

据我所知,没有办法在插入时禁用事务而不将数据库的恢复模式从完整更改为简单。

但要小心,因为只能以简单恢复模式将数据库恢复到最新备份,并且将无法应用自执行备份以来发生的事务中的事务日志。

如果你可以配置一个批处理大小(我知道你可以用NHibernate,对LINQ to SQL没有正面评价)到100或更多,这也可以减少往返数据库的往返次数,这也会增加插入性能。

0

你不能只是将DataContext的Transaction属性设置为null吗?

+3

SQL仍然执行隐式事务,即使您没有指定事务范围。 – 2009-12-06 22:20:57

2

由于LINQ to SQL will create a transaction if one doesn't exist,您所能做的最好的事情就是创建您自己的事务,并为您提供一个可接受的隔离级别。

Transaction transaction = new Transaction(IsolationLevel.Chaos); 
try 
{ 
    using (var dc = new MyDataContext()) 
    { 
     dc.Transaction = transaction; 
     ... 
     transaction.Commit(); 
    } 
} 
catch 
{ 
    transaction.Rollback(); 
} 

或者,您可以提交每次更改,忽略故障。您仍然得到一笔交易,但它仅包含每个单独的变更。

foreach (var foo in foos) 
{ 
    using (var context = new MyDataContext()) 
    { 
     context.Foos.InsertOnSubmit(foo); 
     try 
     { 
      context.SubmitChanges(); 
     } 
     catch {} 
    } 
} 
0

设置ConflictMode到ContinueOnConflict,你将能够成功提交作品的任何变化,你必须在这还成功地为您跟进变化的异常的列表。

我有一个参考使用这种技术来阻止错误打了退堂鼓您提交更改:SandKeySoftware Linq Tutorial

如果分布式事务发生,这应该也是帮助:

using(var scope = new TransactionScope(TransactionScopeOption.Suppress)) 
{ 
    //linqy stuff here 
}