Я использую Dapper, но это применимо к ADO.NET.ADO.NET Долгосрочные транзакции
У меня есть работа в веб-приложении, которое меняет много состояний в базе данных. Чтобы обеспечить результат «все или ничего», я использую транзакцию для управления этим. Для этого все мои классы Repository
делят соединение (которое создается при запросе). В моем соединении я могу позвонить Connection.BeginTransaction()
.
Однако эта операция может занять некоторое время (скажем, 10 секунд), и она блокирует некоторые часто читаемые таблицы, пока это происходит. Я хочу, чтобы другие репозитории на других потоках продолжались без блокировки, пока это происходит.
Похоже, что мне нужно сделать 2 вещи, чтобы это произошло:
1) Установите IsoloationLevel
на что-то вроде ReadUncommited:
_transaction = Connection.BeginTransaction(IsolationLevel.ReadUncommitted);
2) Для всех других соединений, которые не нуждаются транзакции, мне все равно нужно зарегистрировать эти соединения в транзакции, чтобы я мог снова установить ReadUncommited
. Если я этого не сделаю, они все равно будут блокироваться, пока они ждут завершения длительной операции.
Это значит, что мне нужно ВСЕ мои подключения, чтобы начать транзакцию? Это звучит дорого и суб-исполнитель. Есть ли другие решения, которые мне не хватает здесь?
Благодаря
Cheers! Просто для того, чтобы уточнить, вы говорите, что если я использую «Снимок» в моей длительной транзакции, мне не нужно ничего менять на других моих подключениях, чтобы остановить их от блокировки? –
@Matt Roberts: да, но вам нужно учитывать контроль параллелизма –