Подключения могут оставаться открытыми в течение длительного времени при
использовании объектов DataReader, которые являются действительными только
пока подключение открыто.
Транзакции и параллелизм
При наличии в приложении ответственных операций используйте транзакции для их
выполнения. Транзакции позволяют выполнять связанные действия с базой данных как
единую операцию и гарантировать тем самым целостность базы данных. Транзакция считается
завершенной, если все входящие в нее действия выполнены, после этого внесенные в ходе
этой транзакции изменения базы данных становятся постоянными. Транзакции поддерживают
отмену (откат) действий в случае возникновения ошибки, что помогает сохранить целостность
данных в базе данных. Следующие рекомендации помогут при проектировании транзакций:
При проектировании доступа к одному источнику данных по возможности
используйте транзакции на базе подключения. При использовании создаваемых
вручную или явных транзакций реализуйте транзакцию в хранимой процедуре. Если
не можете использовать транзакции, реализуйте компенсационные методы для
возвращения хранилища данных в предыдущее состояние.
При использовании длительных атомарных транзакций избегайте слишком долгого
удержания блокировок. В подобных сценариях лучше использовать
компенсационные блокировки. Если для завершения транзакции требуется
длительное время, используйте асинхронные транзакции, осуществляющие
обратный вызов клиента по завершении. Также для параллельно выполняющихся
приложений, осуществляющих большое число транзакций, используйте технологию
MARS (множество активных результирующих множеств), это позволит избежать
потенциальных взаимоблокировок.
Если вероятность возникновения конфликта данных из-за их одновременного
изменения несколькими пользователями низка (например, когда пользователи,
преимущественно, добавляют данные или редактируют разные строки),
используйте оптимистическую блокировку, при которой действительным считается
последнее обновление. Если вероятность возникновения конфликта данных из-за
их одновременного изменения несколькими пользователями высока (например,
когда пользователи, преимущественно, редактируют одни и те же строки),
используйте пессимистическую блокировку, при которой обновление может
применяться только к последней версии данных. Также учтите вопросы
параллельной обработки при доступе к статическим данным приложения или при
использовании потоков для осуществления асинхронных операций. Статические
данные по природе своей не являются потокобезопасными, т.е. изменения,
вносимые в такие данные в одном потоке, будут оказывать влияние на другие
потоки, использующие эти же данные.
Транзакции должны быть максимально короткими, это обеспечит самые короткие
блокировки и улучшит условия параллельной работы. Однако не следует забывать,
что короткие и простые транзакции могут привести к созданию слишком