【问题标题】:Transaction Scope locks database事务范围锁定数据库
【发布时间】:2017-02-16 12:14:35
【问题描述】:

在一次调用中将数据插入两个表时,我使用了事务范围。但是事务范围持有数据库或锁定特定范围的数据库,此时另一个用户无法对数据库执行任何操作。所以请告诉我避免这种情况的替代解决方案。

using (TransactionScope scope = new TransactionScope())
{
    CamphorTray_OrderDetails ct = new CamphorTray_OrderDetails();

    ct.CamphorTray_ID = ctv.CamphorTray_ID;
    ct.Temple_ID = ctv.Temple_ID;
    ct.For_Date = ctv.For_Date;
    ct.Deity = ctv.Deity;
    ct.Note_Cash = ctv.Note_Cash;
    ct.Coin = ctv.Coin;
    ct.Total_amount = ctv.Total_amount;
    ct.Created_By = ctv.Created_By;
    ct.Created_Date = DateTime.Now;
    ct.Modified_By = ctv.Created_By;
    ct.Modified_Date = DateTime.Now;

    CTOD.Insert(ct);

    InsertAudit_CamphorTray_OrderDetails(ct, "Insert");
    scope.Complete();
}

【问题讨论】:

  • 你默认使用什么隔离级别?这可能是一个原因......

标签: c# linq-to-sql ado.net transactionscope


【解决方案1】:

其他用户访问您的事务数据的能力以及您访问他们的能力以及数据库尝试确保其工作(通过锁定表和/或行)可以由TransactionOptions 控制。

例如,这将是最不安全的,但可能是最“允许”的方式:

var options = new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted };

using (var tranScope = new TransactionScope(TransactionScopeOption.Required, options))
 {

但是在你简单地使用它之前请考虑一下:隔离级别是一个好东西。它有助于使您的数据保持稳定状态。忽略它会导致各种奇怪的错误。您的数据库可以为您提供强大的帮助,不要因为似乎很难正确地关闭它而将其关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多