bar*_*oma 5 entity-framework transactionscope entity-framework-core
我正在使用实体框架,但使用原始查询进行操作。我的操作如下:
\n所以我正在使用交易
\nusing (var transaction = await _context.Database.BeginTransactionAsync())\n{ \n var isExist = await IsExist(id);\n\n if (isExist)\n {\n var deleteQuery = "delete from ....";\n await _context.Database.ExecuteSqlRawAsync(deleteQuery);\n }\n\n var insertQuery = "insert into ...";\n await _context.Database.ExecuteSqlRawAsync(insertQuery);\n}\nRun Code Online (Sandbox Code Playgroud)\n如果插入操作失败,删除的记录是否回滚?
\nUPD:https://learn.microsoft.com/en-us/ef/core/ saving/transactions#controlling-transactions
如果任一命令失败,事务将在处理时自动回滚
所以,我下面的代码在 catch 方面可能有点过分了,但 Commit 仍然是必要的:)
=====================
我认为使用事务的正确方法如下:
using (var transaction = await _context.Database.BeginTransactionAsync())
{
try
{
var isExist = await IsExist(id);
if (isExist)
{
var deleteQuery = "delete from ....";
await _context.Database.ExecuteSqlRawAsync(deleteQuery);
}
var insertQuery = "insert into ...";
await _context.Database.ExecuteSqlRawAsync(insertQuery);
// there we tell DB to finish the transaction,
// mark all changes as permanent and release all locks
transaction.Commit();
}
catch (Exception ex)
{
// there we tell DB to discard all changes
// made by this transaction that may be discarded
transaction.Rollback();
// log error
}
}
Run Code Online (Sandbox Code Playgroud)
但我BeginTransaction*Async*个人以前从未使用过。