首页 > 解决方案 > 是否有必要为这些行使用事务范围

问题描述

我在 Oracle 中有两张表,其中一张是 MtcUnverified 秒是 MtcExit

private bool Verify(Mtcexittran mtcExitTran)
{
    try
    {

        var mtcUnverified = _centraldbContext.Mtcunverifiedtran.FirstOrDefault(a => a.Transactionid.Equals(mtcExitTran.Transactionid));

        if (mtcUnverified == null)
        {
            return false;
        }

        _centraldbContext.Mtcunverifiedtran.Remove(mtcUnverified);

        _centraldbContext.Mtcexittran.Add(mtcExitTran);

        _centraldbContext.SaveChanges();

        return true;
    }

    catch (Exception ex)
    {
       
        return false;
    }

}

我的目标是从 mtcunverified 表中删除记录并将其插入到 mtcexit 表中。我需要在此代码中使用事务范围吗?是否有可能将记录从 mtcunverified 表中删除而不插入到 mtcexit 中?如果无法将记录添加到 mtcexit,我想从 mtcunverified 表中回滚删除。savechanges 方法已经在创建开始事务。因此,如果即使两个进程中的一个有问题,我认为 savechanges 会回滚 2 进程。还是我必须使用事务范围?谢谢你的帮助。

标签: c#.netentity-framework

解决方案


在文档中,在"Save Data/Transaction"下,它说

默认情况下,如果数据库提供程序支持事务,则对 SaveChanges 的一次调用中的所有更改都将应用到事务中。如果任何更改失败,则事务将回滚,并且不会将任何更改应用于数据库。这意味着 SaveChanges 保证要么完全成功,要么在发生错误时保持数据库不变。

对于大多数应用程序,此默认行为就足够了。如果您的应用程序要求认为有必要,您应该只手动控制事务。

因此,除非您已采取措施阻止使用事务的 EF,否则默认值应该没问题。

如果您想要更高级的事务控制,一个事务跨越多个调用SaveChanges,并且您可以回滚到“保存点”,这在文档的同一部分中进行了描述。


推荐阅读