首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在asp.net-core 2.0中进行事务处理?

如何在asp.net-core 2.0中进行事务处理?
EN

Stack Overflow用户
提问于 2017-09-16 19:49:04
回答 3查看 11.5K关注 0票数 1

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-28 04:15:27

是的,man,使用.Net Core2.0及更高版本的System.Transactions.TransactionScope。请检查以下内容:

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

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

票数 -1
EN

Stack Overflow用户

发布于 2020-03-11 04:24:10

代码语言:javascript
复制
//--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
        }
    }
}

注意更新、第一个恢复对象和之后的更新。

代码语言:javascript
复制
//--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));
                }
            }
票数 1
EN

Stack Overflow用户

发布于 2021-09-26 06:57:53

默认情况下,如果数据库提供程序支持事务,则对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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46253570

复制
相关文章

相似问题

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