【问题标题】:How to make a transaction in asp.net-core 2.0?如何在 asp.net-core 2.0 中进行交易?
【发布时间】:2017-09-16 11:49:04
【问题描述】:

我想更新一些值,但万一失败,我需要回滚。如何在 asp.net-core-2.0 中做到这一点?

我还没有找到任何答案。这是因为它还不支持吗?在那种情况下,有哪些替代方案?

【问题讨论】:

标签: transactions asp.net-core-2.0


【解决方案1】:
//--INSIDE YOUR SAVE METHOD--

using (var context = new YOURContext())
{
    using (var transaction = context.Database.BeginTransaction()) //--Startind transactions
    {
        try
        {
            context.YourObject1.Add(new YourObject1 { Url = "http://blogs.msdn.com/dotnet" });
            context.SaveChanges();

            context.YourObject2.Add(new YourObject2 { Url = "http://blogs.msdn.com/visualstudio" });
            context.SaveChanges();

            // Commit transaction if all commands succeed, transaction will auto-rollback
            // when disposed if either commands fails
            transaction.Commit();
        }
        catch (Exception)
        {
            // TODO: Handle failure
        }
    }
}

注意更新,首先恢复对象,然后更新。

//--INSIDE YOU UPDATE METHOD--
...
            if (ModelState.IsValid)
            {
                using (var transaction = _context.Database.BeginTransaction())
                {
                    try
                    {
                        var dataYourObj1 = await _context.YourObj1.SingleAsync(x => x.Id == YourObj1.Id);

                        dataYourObj1.Name = obj1.Name;
                        dataYourObj1.Email = obj1.Email;
                        await _context.SaveChangesAsync();

                        var dataYourObj2 = await _context.YourObj2.SingleAsync(x => x.Id == dataYourObj2.Id);
                        dataYourObj2.field = obj2.Field;
                        await _context.SaveChangesAsync();

                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        Console.WriteLine("Error occurred." + ex);
                    }
                    return RedirectToAction(nameof(Index));
                }
            }

【讨论】:

    【解决方案2】:

    默认情况下,如果数据库提供程序支持事务,则对 SaveChanges 的一次调用中的所有更改都会应用到事务中。如果任何更改失败,则事务将回滚,并且不会将任何更改应用于数据库。这意味着 SaveChanges 保证要么完全成功,要么在发生错误时保持数据库不变。 对于大多数应用程序,此默认行为就足够了。只有在您的应用程序要求认为有必要时,您才应该手动控制事务。

    例如:

    var user = new User { Email = "email", UserName = "username" }; dbContext.Users.Add(user); dbContext.Users.Add(new UserRole { RoleId = 1, UserId = user.id }); await dbContext.SaveChangesAsync();

    更多信息见以下链接:

    https://docs.microsoft.com/en-us/ef/core/saving/transactions

    【讨论】:

      【解决方案3】:

      是的,伙计,使用 System.Transactions.TransactionScope,从 .Net Core 2.0 及更高版本开始可用。检查这个:

      在 ASP.NET 中使用 System.Transactions: https://msdn.microsoft.com/en-us/ms229977

      使用事务范围实现隐式事务: https://msdn.microsoft.com/en-us/ms172152

      【讨论】:

      • 作为改进,您应该引用与此答案相关的材料。即使链接的材料最初回答了问题,链接也会中断并且答案在以后变得毫无价值。至少如果你包含一个摘要,答案可以在某种程度上独立
      猜你喜欢
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多