Замена TransactionScope
От: merge  
Дата: 27.01.23 06:53
Оценка:
Привет.

У нас есть кусок кода который обернут в TransactionScope.
Сначала вызывается скл процедура, а потом через энтити контекст вставляются данные.
Всё происходит в рамках одного коннект к базе! То есть второй коннекшн не открывается в моем понимании, что эскалация до распределенной транзакции была.
Всё вроде норм, но почему-то иногда выкидывается ошибка "this platform doesn't support distributed transactions"
Причем данные не меняются, просто разница во времени. Посмотрел по профайлеру и вижу что происходит событие Transaction promote до распределенной транзакции.

В общем потратил дня 3 в попытках понять и пока склоняюсь что скл по какой-то причине эскалирует. Может из-за временных таблиц в процедуре и там какие то кэши или ресурсов на сервере не хватает и новый коннект.

Сейчас хочу заменить TransactionScope на механизм который гарантирует транзакционность.
Есть какие-то механизмы или решения?
Re: Замена TransactionScope
От: vaa  
Дата: 27.01.23 07:54
Оценка: 2 (1)
Здравствуйте, merge, Вы писали:


M>Сейчас хочу заменить TransactionScope на механизм который гарантирует транзакционность.

M>Есть какие-то механизмы или решения?

using var db = scope.ServiceProvider.GetService<DbContext>();
using var tx = await db.Database.BeginTransactionAsync(stoppingToken);
await db.SaveChangesAsync();
await tx.CommitAsync();
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Замена TransactionScope
От: vmpire Россия  
Дата: 27.01.23 11:59
Оценка:
Здравствуйте, merge, Вы писали:

M>Всё происходит в рамках одного коннект к базе! То есть второй коннекшн не открывается в моем понимании, что эскалация до распределенной транзакции была.

M>Всё вроде норм, но почему-то иногда выкидывается ошибка "this platform doesn't support distributed transactions"
Если это классический фреймворк, то там, вроде, бага была на эту тему, не то в самом фреймворке, не то в MSSQL, за давностью лет уже не помню.
Я когда-то выкрутился, написав свой TransactionScope с сериализацией и логами.
Если это Core, то либо так и не исправили, либо это что-то другое.
Ну ещё может быть, что где-то просто IDisposable не вызывается, конечно.
Отредактировано 27.01.2023 12:00 vmpire . Предыдущая версия .
Re[2]: Замена TransactionScope
От: merge  
Дата: 27.01.23 12:13
Оценка:
Здравствуйте, vmpire, Вы писали:


V>Если это классический фреймворк, то там, вроде, бага была на эту тему, не то в самом фреймворке, не то в MSSQL, за давностью лет уже не помню.


открыл исходники TransactionScope там прямо в комментах много где написао bugbug


V>Я когда-то выкрутился, написав свой TransactionScope с сериализацией и логами.


сколько времени примерно заняло?

V>Если это Core, то либо так и не исправили, либо это что-то другое.


да, коре. 3.1

V>Ну ещё может быть, что где-то просто IDisposable не вызывается, конечно.


поясните как IDisposable тут влияет?
Re[3]: Замена TransactionScope
От: vmpire Россия  
Дата: 27.01.23 12:39
Оценка: 8 (2)
Здравствуйте, merge, Вы писали:

V>>Я когда-то выкрутился, написав свой TransactionScope с сериализацией и логами.

M>сколько времени примерно заняло?
Примерно полдня. Мне много-то от него не нужно было, только держать соединение в контексте треда и выдавать желающим. Ну плюс сами транзакции.

V>>Ну ещё может быть, что где-то просто IDisposable не вызывается, конечно.

M>поясните как IDisposable тут влияет?
Если IDisposable не вызвать, то старое соединение не закроется и TransactionScope попытается открыть в том же потоке новое, что и приводит к распределённой транзакции.
Так что проверьте сперва, всё ли корректно обёрнуто в using.
Re[3]: Замена TransactionScope
От: vaa  
Дата: 28.01.23 01:23
Оценка:
Здравствуйте, merge, Вы писали:

M>да, коре. 3.1


переходите на 6. 3.1 на самом деле не lts совсем.

M>поясните как IDisposable тут влияет?

обычно используется для гарантии вызова очистки ресурсов.
в данном случае для отката не завершенной транзакции.

тут все возможные варианты описаны
https://learn.microsoft.com/en-us/ef/core/saving/transactions
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[4]: Замена TransactionScope
От: merge  
Дата: 28.01.23 08:39
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>Здравствуйте, merge, Вы писали:


M>>да, коре. 3.1


vaa>переходите на 6. 3.1 на самом деле не lts совсем.



не lts по факту во что вылиться может? они же не уберут поддержку коре в след версии винды

там переход на 6 просто в проекте поменять или есть изменения в фреймворке что работать по другому может?
Re: Замена TransactionScope
От: microuser  
Дата: 28.01.23 08:51
Оценка:
Если код аснихронный то transactionscope надо создавать с указанием об этом. А так надо код смотреть, откуда мы знаем что там одно и то же соединение?
Re[5]: Замена TransactionScope
От: vaa  
Дата: 28.01.23 10:10
Оценка:
Здравствуйте, merge, Вы писали:

M>Здравствуйте, vaa, Вы писали:


vaa>>Здравствуйте, merge, Вы писали:


M>>>да, коре. 3.1


vaa>>переходите на 6. 3.1 на самом деле не lts совсем.



M>не lts по факту во что вылиться может? они же не уберут поддержку коре в след версии винды


M>там переход на 6 просто в проекте поменять или есть изменения в фреймворке что работать по другому может?


кое-что конечно придется поправить, но не много. проверить же несложно. я так и делал.
☭ ✊ В мире нет ничего, кроме движущейся материи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.