powered by simpleCommunicator - 2.0.33     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF Core set default isolation level
9 сообщений из 9, страница 1 из 1
EF Core set default isolation level
    #40002214
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Как в EF Core (3.1) задать isolation level по умолчанию для всех транзакций, где он явно не указан?

Надо чтобы это:
Код: c#
1.
using var tran = await _db.Database.BeginTransactionAsync();


Для всех БД работало как:
Код: c#
1.
using var tran = await _db.Database.BeginTransactionAsync(IsolationLevel.ReadCommitted);


В частности используются MSSQL и SQLite3, а там по умолчанию разные уровни.

В логе "Microsoft.EntityFrameworkCore.Database.Transaction" видно, если сразу не указать, он пишет Unspecified а потом в зависимости от поставщика выставляет его по умолчанию.

Хочется для приложения не указывать явно везде уровень изоляции, а задать по умолчанию один на все приложение независимо от провайдера. А где потребуется отличный от заданного в приложении уже указывать.
...
Рейтинг: 0 / 0
EF Core set default isolation level
    #40002239
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
EF Core set default isolation level
    #40002296
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, это видел.
Переопределение SaveChangesAsync не подойдет...
Надо управлять IDbContextTransaction (их будет несколько для разных контекстов, и может быть микс Commit/Rollback)

Я предполагал, что есть некая глобальная настройка для EF которую можно задать при конфигурации..
Что-то вроде: вместо Unspecified использовать ReadCommitted, если явно не указано иное для всех провайдеров.
Либо явно для каждого провайдера задать преобразование Unspecified в свое.

Посмотрел исходники для Sqlite, так там преобразование Unspecified в Serializable внутри SqliteTransaction происходит, а везде пробрасывание IsolationLevel идет как есть

Если было бы разрешено переопределять стандартный метод, методом расширения (с такими же параметрами), то это было бы, самое то, или как писал выше, глобальная настройка для контекста..

Из простых вариантов сделать метод расширения, с другим названием (а-ля BeginTransactionAsync2) и использовать его - так себе решение.
Переопределить Database в DBContext, чтобы он использовал переопределенный DatabaseFacade - еще хуже, т.к. внутри DBContext к _database явно обращаются.
...
Рейтинг: 0 / 0
EF Core set default isolation level
    #40002310
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
В частности используются MSSQL и SQLite3

Это SQL-сервера с очень разной "философией", не надо пытаться делать чтобы в обоих все было хорошо. В итоге будет хорошо в SQLite3, а в продакшене с MSSQL будет все грустно.
...
Рейтинг: 0 / 0
EF Core set default isolation level
    #40002318
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

В целом способ подходит для переопределения SaveChangesAsync
Как минимум это закроет проблему транзакции с изоляцией по умолчанию, если транзакция явно не задана.

Остается только проблема, если явно не указывать изоляцию в BeginTransactionAsync
...
Рейтинг: 0 / 0
EF Core set default isolation level
    #40002319
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В SQLite3 всего два режима изоляции: либо максимальная с блокировкой, либо грязное чтение.
...
Рейтинг: 0 / 0
EF Core set default isolation level
    #40002320
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно вопрос в контексте Sqlite не имеет смысла.. там просто нет ReadCommitted (P.S. пока писал, Dima T тоже самое ответил))

Но вот, если приложение абстрагировано от поставщика данных, то переопределение SaveChangesAsync будет кстати, а там где надо указать явно - указывать явно.
...
Рейтинг: 0 / 0
EF Core set default isolation level
    #40002375
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
Как минимум это закроет проблему транзакции с изоляцией по умолчанию, если транзакция явно не задана.


Не-не, проблема-то какая изначально? У транзакций нет проблем :)
...
Рейтинг: 0 / 0
EF Core set default isolation level
    #40002453
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Проблема в голове и лени)))

Хотелось в двух случаях, если явно не указывать изоляцию
здесь
_db.Database.BeginTransactionAsync(); // Открываем транзакцию с изоляцией по умолчанию (но заданной нами)
и здесь
_db.SaveChangesAsync(); // Аналогично выше

Чтобы была например всегда IsolationLevel.RepeatableRead

Если с SaveChangesAsync все просто, то с BeginTransactionAsync нет...

Но я тут переспал с мыслью, что это просто лень писать каждый раз явно степень изоляции, а возможность факта смены изоляции по умолчанию для приложения - это моветон
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF Core set default isolation level
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]