|
EF Core set default isolation level
|
|||
---|---|---|---|
#18+
Добрый день. Как в EF Core (3.1) задать isolation level по умолчанию для всех транзакций, где он явно не указан? Надо чтобы это: Код: c# 1.
Для всех БД работало как: Код: c# 1.
В частности используются MSSQL и SQLite3, а там по умолчанию разные уровни. В логе "Microsoft.EntityFrameworkCore.Database.Transaction" видно, если сразу не указать, он пишет Unspecified а потом в зависимости от поставщика выставляет его по умолчанию. Хочется для приложения не указывать явно везде уровень изоляции, а задать по умолчанию один на все приложение независимо от провайдера. А где потребуется отличный от заданного в приложении уже указывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 16:27 |
|
EF Core set default isolation level
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 16:59 |
|
EF Core set default isolation level
|
|||
---|---|---|---|
#18+
Спасибо, это видел. Переопределение SaveChangesAsync не подойдет... Надо управлять IDbContextTransaction (их будет несколько для разных контекстов, и может быть микс Commit/Rollback) Я предполагал, что есть некая глобальная настройка для EF которую можно задать при конфигурации.. Что-то вроде: вместо Unspecified использовать ReadCommitted, если явно не указано иное для всех провайдеров. Либо явно для каждого провайдера задать преобразование Unspecified в свое. Посмотрел исходники для Sqlite, так там преобразование Unspecified в Serializable внутри SqliteTransaction происходит, а везде пробрасывание IsolationLevel идет как есть Если было бы разрешено переопределять стандартный метод, методом расширения (с такими же параметрами), то это было бы, самое то, или как писал выше, глобальная настройка для контекста.. Из простых вариантов сделать метод расширения, с другим названием (а-ля BeginTransactionAsync2) и использовать его - так себе решение. Переопределить Database в DBContext, чтобы он использовал переопределенный DatabaseFacade - еще хуже, т.к. внутри DBContext к _database явно обращаются. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 18:19 |
|
EF Core set default isolation level
|
|||
---|---|---|---|
#18+
X-Cite В частности используются MSSQL и SQLite3 Это SQL-сервера с очень разной "философией", не надо пытаться делать чтобы в обоих все было хорошо. В итоге будет хорошо в SQLite3, а в продакшене с MSSQL будет все грустно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 19:13 |
|
EF Core set default isolation level
|
|||
---|---|---|---|
#18+
hVostt, В целом способ подходит для переопределения SaveChangesAsync Как минимум это закроет проблему транзакции с изоляцией по умолчанию, если транзакция явно не задана. Остается только проблема, если явно не указывать изоляцию в BeginTransactionAsync ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 20:07 |
|
EF Core set default isolation level
|
|||
---|---|---|---|
#18+
В SQLite3 всего два режима изоляции: либо максимальная с блокировкой, либо грязное чтение. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 20:16 |
|
EF Core set default isolation level
|
|||
---|---|---|---|
#18+
Собственно вопрос в контексте Sqlite не имеет смысла.. там просто нет ReadCommitted (P.S. пока писал, Dima T тоже самое ответил)) Но вот, если приложение абстрагировано от поставщика данных, то переопределение SaveChangesAsync будет кстати, а там где надо указать явно - указывать явно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 20:19 |
|
EF Core set default isolation level
|
|||
---|---|---|---|
#18+
X-Cite Как минимум это закроет проблему транзакции с изоляцией по умолчанию, если транзакция явно не задана. Не-не, проблема-то какая изначально? У транзакций нет проблем :) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 00:10 |
|
EF Core set default isolation level
|
|||
---|---|---|---|
#18+
hVostt, Проблема в голове и лени))) Хотелось в двух случаях, если явно не указывать изоляцию здесь _db.Database.BeginTransactionAsync(); // Открываем транзакцию с изоляцией по умолчанию (но заданной нами) и здесь _db.SaveChangesAsync(); // Аналогично выше Чтобы была например всегда IsolationLevel.RepeatableRead Если с SaveChangesAsync все просто, то с BeginTransactionAsync нет... Но я тут переспал с мыслью, что это просто лень писать каждый раз явно степень изоляции, а возможность факта смены изоляции по умолчанию для приложения - это моветон ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 11:03 |
|
|
start [/forum/topic.php?fid=17&fpage=2&tid=1349053]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
57ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 232ms |
total: | 388ms |
0 / 0 |