Ausgabe
Ich verwende das Entity Framework, mache meine Operationen aber mit Rohabfragen. Meine Operationen sind wie folgt:
- Prüfen Sie, ob recırd mit integration_id existiert
- Datensatz löschen, wenn verlassen
- Neuen Datensatz einfügen
Also verwende ich Transaktion
using (var transaction = await _context.Database.BeginTransactionAsync())
{
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);
}
Wenn der Einfügevorgang fehlschlägt, wird der gelöschte Datensatz zurückgesetzt?
Lösung
UPD: https://learn.microsoft.com/en-us/ef/core/saving/transactions#controlling-transactions
Die Transaktion wird automatisch zurückgesetzt, wenn sie verworfen wird, wenn einer der Befehle fehlschlägt
Also, mein Code unten mag auf der Catch-Seite übertrieben sein, aber Commit ist immer noch wichtig 🙂
======================
Ich glaube, die richtige Art der Verwendung von Transaktionen wäre die folgende:
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
}
}
Aber ich BeginTransaction*Async*
persönlich habe es noch nie benutzt.
Beantwortet von – ornic
Antwort geprüft von – Mary Flores (FixError Volunteer)