2

我必须在我的数据库中添加很多信息。添加此信息大约需要 5-7 分钟。我需要添加交易。

我试过这个:

try { 
    db.Connection.Open();
    db.Transaction = db.Connection.BeginTransaction(); 
    UpdateTable1();
    UpdateBigTable2();
    ...
    db.Transaction.Commit(); 
} catch {
    db.Transaction.Rollback();  
}

但是当我的数据库正在更新时,我无法读取或使用我的数据库做任何事情。

我试图设置IsolationLevel,但没有任何帮助。

我试过这个:

using (var ts = new TransactionScope()) {
    UpdateTable1();
    ts.Complete();
}

但程序在 2-3 分钟后崩溃。

这个解决方案也没有帮助:

var transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
transactionOptions.Timeout = TimeSpan.MaxValue;
using (var ts = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
{
    ...
}

我可以访问我的数据库,当它更新时,如果我设置TransactionScopeOption.Suppress 但在这种情况下事务不起作用。

4

3 回答 3

2

是的,如果您启动一个操作大量记录的事务,并且需要很长时间才能完成,那么直接结果是竞争操作将被阻止。对于“可序列化”事务尤其如此,因为它们占用的锁最多(包括键范围锁等)。这是交易的性质;它是 ACID 中的 I。

选项:

  • 不要在一笔巨额交易中做所有事情
  • 让您的读取操作有意读取过去的锁(这是非常双刃剑 - 可以,但可能会导致大问题 - 谨慎处理) - 例如NOLOCKREAD UNCOMMITTED.
  • 在完整的 SQL 服务器(不是 CE)上,尝试使用快照隔离
于 2012-10-05T08:21:56.703 回答
1
using (var trans = new TransactionScope(
 TransactionScopeOption.Required, 
    new TransactionOptions
    {
        IsolationLevel = IsolationLevel.ReadUncommitted
    }
))
{
    // Your LINQ to SQL query goes here where you read some data from DB
}

在更新表(插入、删除或更新)时,它们会被锁定,因此如果要读取尚未提交的数据,则可以使用 Transaction IsolationLevel.ReadUncommitted 来允许脏读

于 2012-10-05T08:23:29.813 回答
0

你试过这个吗?

transactionOptions.Timeout = TransactionManager.MaximumTimeout;
于 2014-01-31T12:09:39.990 回答