C# 如果事务已提交或未提交,如何返回?
我想检查事务是否已提交并返回值 我已经写了下面的代码,但我不知道如何返回,如果它是成功与否C# 如果事务已提交或未提交,如何返回?,c#,asp.net-core,C#,Asp.net Core,我想检查事务是否已提交并返回值 我已经写了下面的代码,但我不知道如何返回,如果它是成功与否 public Task Insert(List<PortfolioCompanyLinkModel> record, CancellationToken cancellationToken = default(CancellationToken)) { using (var transaction = _context.Database.BeginTransaction())
public Task Insert(List<PortfolioCompanyLinkModel> record, CancellationToken cancellationToken = default(CancellationToken))
{
using (var transaction = _context.Database.BeginTransaction())
{
try
{
foreach (var item in record)
{
PortfolioCompanyLink portfolioCompanyLink = new PortfolioCompanyLink();
portfolioCompanyLink.PortfolioCompanyId = item.PortfolioCompanyId;
portfolioCompanyLink.URL = item.URL;
portfolioCompanyLink.LinkId = item.LinkId;
portfolioCompanyLink.CreatedBy = portfolioCompanyLink.ModifiedBy = _loggedInUser;
portfolioCompanyLink.CreatedOn = portfolioCompanyLink.ModifiedOn = DateTime.UtcNow;
_context.PortfolioCompanyLink.AddAsync(portfolioCompanyLink, cancellationToken);
}
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
}
}
//return _context.PortfolioCompanyLink.AddAsync(record, cancellationToken);
}
公共任务插入(列表记录,CancellationToken CancellationToken=default(CancellationToken))
{
使用(var事务=_context.Database.BeginTransaction())
{
尝试
{
foreach(记录中的var项目)
{
PortfolioCompanyLink PortfolioCompanyLink=新PortfolioCompanyLink();
portfolioCompanyLink.PortfolioCompanyId=item.PortfolioCompanyId;
portfolioCompanyLink.URL=item.URL;
portfolioCompanyLink.LinkId=item.LinkId;
portfolioCompanyLink.CreatedBy=portfolioCompanyLink.ModifiedBy=\u loggedInUser;
portfolioCompanyLink.CreatedOn=portfolioCompanyLink.ModifiedOn=DateTime.UtcNow;
_context.PortfolioCompanyLink.AddAsync(PortfolioCompanyLink,cancellationToken);
}
Commit();
}
捕获(例外情况除外)
{
transaction.Rollback();
}
}
//返回_context.PortfolioCompanyLink.AddAsync(记录,cancellationToken);
}
请帮助我在此处编写返回语句如果您想返回一个指示“是否成功”的值,您应该将方法的返回类型更改为
Task
,并返回一个bool
:
public async Task<bool> Insert(List<PortfolioCompanyLinkModel> record, CancellationToken cancellationToken = default(CancellationToken))
{
using (var transaction = _context.Database.BeginTransaction())
{
try
{
foreach (var item in record)
{
PortfolioCompanyLink portfolioCompanyLink = new PortfolioCompanyLink();
portfolioCompanyLink.PortfolioCompanyId = item.PortfolioCompanyId;
portfolioCompanyLink.URL = item.URL;
portfolioCompanyLink.LinkId = item.LinkId;
portfolioCompanyLink.CreatedBy = portfolioCompanyLink.ModifiedBy = _loggedInUser;
portfolioCompanyLink.CreatedOn = portfolioCompanyLink.ModifiedOn = DateTime.UtcNow;
await _context.PortfolioCompanyLink.AddAsync(portfolioCompanyLink, cancellationToken);
}
transaction.Commit();
return true;
}
catch (Exception ex)
{
transaction.Rollback();
return false;
}
}
}
公共异步任务插入(列表记录,CancellationToken CancellationToken=default(CancellationToken))
{
使用(var事务=_context.Database.BeginTransaction())
{
尝试
{
foreach(记录中的var项目)
{
PortfolioCompanyLink PortfolioCompanyLink=新PortfolioCompanyLink();
portfolioCompanyLink.PortfolioCompanyId=item.PortfolioCompanyId;
portfolioCompanyLink.URL=item.URL;
portfolioCompanyLink.LinkId=item.LinkId;
portfolioCompanyLink.CreatedBy=portfolioCompanyLink.ModifiedBy=\u loggedInUser;
portfolioCompanyLink.CreatedOn=portfolioCompanyLink.ModifiedOn=DateTime.UtcNow;
wait_context.PortfolioCompanyLink.AddAsync(PortfolioCompanyLink,cancellationToken);
}
Commit();
返回true;
}
捕获(例外情况除外)
{
transaction.Rollback();
返回false;
}
}
}
在上面的示例代码中,我还将该方法标记为
async
,并等待AddAsync
方法。您可以使用以下方法:
Transaction.Current.TransactionInformation.Status
要获取状态,请执行以下操作:
这是一个枚举。根据MSDN:
中止2事务已回滚 活动0
事务的状态未知,因为仍必须对某些参与者进行轮询 承诺1
事务已提交 印度支那3 您的代码可以如下所示:
public Task Insert(List<PortfolioCompanyLinkModel> record, CancellationToken cancellationToken = default(CancellationToken))
{
using (var transaction = _context.Database.BeginTransaction())
{
try
{
foreach (var item in record)
{
PortfolioCompanyLink portfolioCompanyLink = new PortfolioCompanyLink();
portfolioCompanyLink.PortfolioCompanyId = item.PortfolioCompanyId;
portfolioCompanyLink.URL = item.URL;
portfolioCompanyLink.LinkId = item.LinkId;
portfolioCompanyLink.CreatedBy = portfolioCompanyLink.ModifiedBy = _loggedInUser;
portfolioCompanyLink.CreatedOn = portfolioCompanyLink.ModifiedOn = DateTime.UtcNow;
_context.PortfolioCompanyLink.AddAsync(portfolioCompanyLink, cancellationToken);
}
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
}
finally
{
var status = transaction.TransactionInformation.Status;
if (status.Committed)
return true;
return false;
}
}
//return _context.PortfolioCompanyLink.AddAsync(record, cancellationToken);
}
公共任务插入(列表记录,CancellationToken CancellationToken=default(CancellationToken))
{
使用(var事务=_context.Database.BeginTransaction())
{
尝试
{
foreach(记录中的var项目)
{
PortfolioCompanyLink PortfolioCompanyLink=新PortfolioCompanyLink();
portfolioCompanyLink.PortfolioCompanyId=item.PortfolioCompanyId;
portfolioCompanyLink.URL=item.URL;
portfolioCompanyLink.LinkId=item.LinkId;
portfolioCompanyLink.CreatedBy=portfolioCompanyLink.ModifiedBy=\u loggedInUser;
portfolioCompanyLink.CreatedOn=portfolioCompanyLink.ModifiedOn=DateTime.UtcNow;
_context.PortfolioCompanyLink.AddAsync(PortfolioCompanyLink,cancellationToken);
}
Commit();
}
捕获(例外情况除外)
{
transaction.Rollback();
}
最后
{
var状态=transaction.TransactionInformation.status;
如果(状态已提交)
返回true;
返回false;
}
}
//返回_context.PortfolioCompanyLink.AddAsync(记录,cancellationToken);
}
mm8的回答解释了如果代码成功与否,如何返回true/false。没有理由检查事务的状态,因为调用提交或回滚的是代码本身。即使
Commit
抛出,也会执行catch
块并再次抛出,因为事务已经回滚
不过,在EF/EF核心中不需要这样的代码。DbContext缓存所有更改,并仅在调用SaveChanges
时将其保存到数据库中。本教程中的部分介绍:
对于大多数数据库提供程序,SaveChanges是事务性的。这意味着所有操作要么成功,要么失败,并且操作永远不会被部分应用
将多个对象保存到数据库所需的全部工作是:
foreach (var item in record)
{
PortfolioCompanyLink portfolioCompanyLink = new PortfolioCompanyLink();
.....
//In-memory operation only. Doesn't need awaiting. Doesn't change the database
//This only modifies the in-memory entities tracked by the context
_context.PortfolioCompanyLink.Add(portfolioCompanyLink);
}
//Writes *all* changes to the database in a single transaction
await _context.SaveChangesAsync(cancellationToken);
不需要显式事务savechangesync
将回滚所有更改并在出现任何错误时抛出
事实上,尝试按自定义AddAsync
方法的方式在每个步骤上调用savechangesync
,将产生意想不到的后果<代码>保存更改同步保存所有更改,而不仅仅是最后一个更改。如果该上下文有待删除的更新,则对AddAsync
的第一次调用可能会删除或更新记录
显式长时间运行事务的另一个问题是,即使对于小型应用程序,它们也会严重损害可伸缩性。事务不断更新它所接触的行和表,从而阻止其他事务。让事务无故保持活动状态会导致阻塞甚至死锁。不要