Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF Core set default isolation level / 9 сообщений из 9, страница 1 из 1
24.09.2020, 16:27
    #40002214
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF Core set default isolation level
Добрый день.
Как в 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
24.09.2020, 16:59
    #40002239
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF Core set default isolation level
...
Рейтинг: 0 / 0
24.09.2020, 18:19
    #40002296
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF Core set default isolation level
Спасибо, это видел.
Переопределение SaveChangesAsync не подойдет...
Надо управлять IDbContextTransaction (их будет несколько для разных контекстов, и может быть микс Commit/Rollback)

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

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

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

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

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

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

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

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


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

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

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

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

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

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


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