SQLite -Fehler 6: 'Die Datenbanktabelle ist gesperrt'.
Code: Select all
var connectionString = $"Data Source=file:{DatabaseAlias};mode=memory;cache=shared";
optionsBuilder.UseSqlite(connectionString);
< /code>
Der Test: < /p>
var context1 = factory.CreateDbContext();
var context2 = factory.CreateDbContext();
context1.WithTransaction(() =>
{
var keysFromContext1 = context1.Keys.ToList();
keysFromContext1.First().Name = "Changed First";
context2.WithTransaction(() =>
{
var employeesFromContext2 = context2.Employees.ToList();
employeesFromContext2.First().Name = "Changed Second";
context1.SaveChanges();
context2.SaveChanges();
});
});
< /code>
Transaktionshandhabung: < /p>
public void WithTransaction(Action action)
{
WithTransaction(action, IsolationLevel.ReadUncommitted);
}
public void WithTransaction(Action action, IsolationLevel isolationLevel)
{
if (Database.CurrentTransaction != null)
{
action();
return;
}
Database.BeginTransaction(isolationLevel);
try
{
action();
Database.CommitTransaction();
}
catch
{
Database.RollbackTransaction();
throw;
}
}
< /code>
Die beiden Kontexte ändern Daten zu verschiedenen Entitäten, aber immer noch eine Kollision. Ich musste die Standard -IsolationLevel
Ist es ein Muss, Transaktionen zu verpflichten/rollen, um anschließend mit Transaktionen umgegangen zu werden, auch wenn sie an verschiedenen Unternehmen arbeiten?