c# - 是否有必要为这些行使用事务范围
问题描述
我在 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 进程。还是我必须使用事务范围?谢谢你的帮助。
解决方案
在文档中,在"Save Data/Transaction"下,它说
默认情况下,如果数据库提供程序支持事务,则对 SaveChanges 的一次调用中的所有更改都将应用到事务中。如果任何更改失败,则事务将回滚,并且不会将任何更改应用于数据库。这意味着 SaveChanges 保证要么完全成功,要么在发生错误时保持数据库不变。
对于大多数应用程序,此默认行为就足够了。如果您的应用程序要求认为有必要,您应该只手动控制事务。
因此,除非您已采取措施阻止使用事务的 EF,否则默认值应该没问题。
如果您想要更高级的事务控制,一个事务跨越多个调用SaveChanges
,并且您可以回滚到“保存点”,这在文档的同一部分中进行了描述。
推荐阅读
- visual-studio-code - Visual Studio Code:如何在视图容器中创建菜单
- ios - SwiftUI 状态在我的应用程序中根本不起作用
- node.js - 第一次成功查询heroku postgres表后,每次查询都失败
- python - 如何在python中找到素数
- javascript - 如何进行并行异步/等待 api 标注
- python - 如何访问列表中列表元素的索引
- graphql - 来自 GraphQL Union 的多种类型的模式
- java - 将图像保存到临时目录并打开它
- javascript - switch 语句不起作用,直接进入默认值
- spring-integration - 如何为春季发布订阅频道创建多个单线程订阅者