База данных SQLite в памяти не любит двухфазный коммитC#

Место общения программистов C#
Ответить
Anonymous
 База данных SQLite в памяти не любит двухфазный коммит

Сообщение Anonymous »

Наш DB-зависимый код издевается над DB SQLite In-Memory (в то время как фактическое время выполнения производства может произойти в совершенно разных средах, таких как MSSQL, DB2, Oracle, Sybase). < /p>
Я пытаюсь создать двухфазную процедуру (для журнала действий, который сохраняется, когда контекст базы данных, связанный с ним, сохраняется). Иногда изменения в протоколизировании происходят в той же базе данных, где проживают таблицы ActionLog. Вот где возникает проблема. Исключение брошено через 30 секунд: «Ошибка SQLite 6: 'Таблица базы данных заблокирована'.» var connectionString = $"Data Source=file:{DatabaseAlias};mode=memory;cache=shared";
optionsBuilder.UseSqlite(connectionString);
< /code>
Это тест, который я настройка: < /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>
Это код для обработки транзакций: < /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>
Как видите, два контекста изменяют данные на разных объектах, но все же появляется столкновение. < /p>
Мне также пришлось изменить Изоляция по умолчанию. Несколько транзакций за раз, необходимо ли для совершения / операций с откатом, чтобы впоследствии запустили обработанные транзакции, даже если они работают над совершенно разными сущностями? Всегда есть ли центральные замки эффективно предотвращение двухфазных коммитов в одной и той же базе данных?


Подробнее здесь: https://stackoverflow.com/questions/794 ... ase-commit
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»