У нас есть кусок кода который обернут в TransactionScope.
Сначала вызывается скл процедура, а потом через энтити контекст вставляются данные.
Всё происходит в рамках одного коннект к базе! То есть второй коннекшн не открывается в моем понимании, что эскалация до распределенной транзакции была.
Всё вроде норм, но почему-то иногда выкидывается ошибка "this platform doesn't support distributed transactions"
Причем данные не меняются, просто разница во времени. Посмотрел по профайлеру и вижу что происходит событие Transaction promote до распределенной транзакции.
В общем потратил дня 3 в попытках понять и пока склоняюсь что скл по какой-то причине эскалирует. Может из-за временных таблиц в процедуре и там какие то кэши или ресурсов на сервере не хватает и новый коннект.
Сейчас хочу заменить TransactionScope на механизм который гарантирует транзакционность.
Есть какие-то механизмы или решения?
M>Сейчас хочу заменить TransactionScope на механизм который гарантирует транзакционность. M>Есть какие-то механизмы или решения?
using var db = scope.ServiceProvider.GetService<DbContext>();
using var tx = await db.Database.BeginTransactionAsync(stoppingToken);
await db.SaveChangesAsync();
await tx.CommitAsync();
Здравствуйте, merge, Вы писали:
M>Всё происходит в рамках одного коннект к базе! То есть второй коннекшн не открывается в моем понимании, что эскалация до распределенной транзакции была. M>Всё вроде норм, но почему-то иногда выкидывается ошибка "this platform doesn't support distributed transactions"
Если это классический фреймворк, то там, вроде, бага была на эту тему, не то в самом фреймворке, не то в MSSQL, за давностью лет уже не помню.
Я когда-то выкрутился, написав свой TransactionScope с сериализацией и логами.
Если это Core, то либо так и не исправили, либо это что-то другое.
Ну ещё может быть, что где-то просто IDisposable не вызывается, конечно.
Здравствуйте, merge, Вы писали:
V>>Я когда-то выкрутился, написав свой TransactionScope с сериализацией и логами. M>сколько времени примерно заняло?
Примерно полдня. Мне много-то от него не нужно было, только держать соединение в контексте треда и выдавать желающим. Ну плюс сами транзакции.
V>>Ну ещё может быть, что где-то просто IDisposable не вызывается, конечно. M>поясните как IDisposable тут влияет?
Если IDisposable не вызвать, то старое соединение не закроется и TransactionScope попытается открыть в том же потоке новое, что и приводит к распределённой транзакции.
Так что проверьте сперва, всё ли корректно обёрнуто в using.
переходите на 6. 3.1 на самом деле не lts совсем.
M>поясните как IDisposable тут влияет?
обычно используется для гарантии вызова очистки ресурсов.
в данном случае для отката не завершенной транзакции.
Здравствуйте, merge, Вы писали:
M>Здравствуйте, vaa, Вы писали:
vaa>>Здравствуйте, merge, Вы писали:
M>>>да, коре. 3.1
vaa>>переходите на 6. 3.1 на самом деле не lts совсем.
M>не lts по факту во что вылиться может? они же не уберут поддержку коре в след версии винды
M>там переход на 6 просто в проекте поменять или есть изменения в фреймворке что работать по другому может?
кое-что конечно придется поправить, но не много. проверить же несложно. я так и делал.