2015-07-09 6 views
0

Я использую Dapper, но это применимо к ADO.NET.ADO.NET Долгосрочные транзакции

У меня есть работа в веб-приложении, которое меняет много состояний в базе данных. Чтобы обеспечить результат «все или ничего», я использую транзакцию для управления этим. Для этого все мои классы Repository делят соединение (которое создается при запросе). В моем соединении я могу позвонить Connection.BeginTransaction().

Однако эта операция может занять некоторое время (скажем, 10 секунд), и она блокирует некоторые часто читаемые таблицы, пока это происходит. Я хочу, чтобы другие репозитории на других потоках продолжались без блокировки, пока это происходит.

Похоже, что мне нужно сделать 2 вещи, чтобы это произошло:

1) Установите IsoloationLevel на что-то вроде ReadUncommited:

_transaction = Connection.BeginTransaction(IsolationLevel.ReadUncommitted); 

2) Для всех других соединений, которые не нуждаются транзакции, мне все равно нужно зарегистрировать эти соединения в транзакции, чтобы я мог снова установить ReadUncommited. Если я этого не сделаю, они все равно будут блокироваться, пока они ждут завершения длительной операции.

Это значит, что мне нужно ВСЕ мои подключения, чтобы начать транзакцию? Это звучит дорого и суб-исполнитель. Есть ли другие решения, которые мне не хватает здесь?

Благодаря

ответ

3

Имейте в виду, что существует компромисс между использованием замков или нет, речь идет о производительности против управления параллелизмом. Поэтому я не думаю, что вы должны использовать ReadUncommitedвсе время.

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

Как правило, мы используем этот уровень изоляции, когда производительность является первым приоритетом и не нуждается в точности данных

Я хочу, чтобы другие операции РЕПО на другие потоки, чтобы продолжить без блокировки в то время как это происходит.

Я думаю, вы можете попробовать IsolationLevel.SnapShotтолько на сделки, что делает долго блокировки работы: https://msdn.microsoft.com/en-us/library/tcbchxcb(v=vs.110).aspx

Извлеченный по ссылке:

Термин «моментальный снимок» отражает тот факт, что все запросов в транзакции см. ту же самую версию или моментальный снимок базы данных на основе о состоянии базы данных в момент, когда transa начинается. Никакие блокировки не получены в базовых строках данных или данных в транзакции моментального снимка, что позволяет выполнять другие транзакции без блокировки по предыдущей незавершенной транзакции .Операции, которые изменяют данные, не блокируют транзакции , которые считывают данные, а транзакции, которые считывают данные, не блокируют транзакции, которые записывают данные, как обычно, по умолчанию Уровень готовности READ COMMITTED в SQL Server. Это неблокирующее поведение также значительно снижает вероятность блокировок для сложных транзакций .

Следует иметь в виду, что огромное количество данных может быть сгенерировано в tempdb для хранилища версий, если есть много изменений.

+0

Cheers! Просто для того, чтобы уточнить, вы говорите, что если я использую «Снимок» в моей длительной транзакции, мне не нужно ничего менять на других моих подключениях, чтобы остановить их от блокировки? –

+0

@Matt Roberts: да, но вам нужно учитывать контроль параллелизма –

Смежные вопросы