我想要更新一些值,但如果其中一个失败了,我需要回滚。我如何在asp.net-core-2.0中做到这一点?
我还没有找到任何答案。这是因为它还不受支持吗?在这种情况下,有哪些替代方案?
发布于 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
发布于 2020-03-11 04:24:10
//--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));
}
}发布于 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
https://stackoverflow.com/questions/46253570
复制相似问题