首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事务和TransactionScope隔离

事务和TransactionScope隔离
EN

Stack Overflow用户
提问于 2012-10-05 16:17:38
回答 3查看 5.7K关注 0票数 2

我必须向我的数据库中添加大量信息。添加此信息大约需要5-7分钟。并且我需要添加事务。

我试过这个:

代码语言:javascript
复制
try { 
    db.Connection.Open();
    db.Transaction = db.Connection.BeginTransaction(); 
    UpdateTable1();
    UpdateBigTable2();
    ...
    db.Transaction.Commit(); 
} catch {
    db.Transaction.Rollback();  
}

但是当我的数据库在更新时,我不能读取我的数据库或对我的数据库做任何事情。

我试着设置IsolationLevel,但都没有用。

我试过这个:

代码语言:javascript
复制
using (var ts = new TransactionScope()) {
    UpdateTable1();
    ts.Complete();
}

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

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

代码语言:javascript
复制
var transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
transactionOptions.Timeout = TimeSpan.MaxValue;
using (var ts = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
{
    ...
}

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

EN

回答 3

Stack Overflow用户

发布于 2012-10-05 16:21:57

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

选项:

快照隔离不是在一个巨大的transaction

  • have中执行所有操作您的读取操作故意读过锁(这是巨大的双刃剑-可以很好,但可能会导致大问题-请谨慎对待)-例如NOLOCKREAD UNCOMMITTED.

  • on
  • (不是CE),请尝试使用快照隔离
票数 2
EN

Stack Overflow用户

发布于 2012-10-05 16:23:30

代码语言:javascript
复制
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来允许脏读取

票数 1
EN

Stack Overflow用户

发布于 2014-01-31 20:09:40

你试过这个吗?

代码语言:javascript
复制
transactionOptions.Timeout = TransactionManager.MaximumTimeout;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12742241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档