Наш 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
База данных SQLite в памяти не любит двухфазный коммит ⇐ C#
Место общения программистов C#
-
Anonymous
1738742733
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>
Мне также пришлось изменить Изоляция по умолчанию. Несколько транзакций за раз, необходимо ли для совершения / операций с откатом, чтобы впоследствии запустили обработанные транзакции, даже если они работают над совершенно разными сущностями? Всегда есть ли центральные замки эффективно предотвращение двухфазных коммитов в одной и той же базе данных?
Подробнее здесь: [url]https://stackoverflow.com/questions/79411850/sqlite-in-memory-database-does-not-like-a-two-phase-commit[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия