Правильный код
Параллельное выполнение операций
Проблемы параллельного выполнения операций возникают всякий раз, когда несколько процессов или потоков вычислений предпринимают попытки манипуляций одними и теми же элементами данных.
- Проблемы параллелизма :
- утраченные изменения (lost updates) - при одновременном изменении более раннее изменение будет утеряно
- несогласованное чтение (inconsistent read) - возникает в ситуациях, когда считываются две корректные сами по себе порции данных, которые, однако, не могут существовать в один и тот же момент времени
- потеря достоверности (correctness) - при изменении данных в параллельном выполнении
Все операции, выполняемые системой, протекают в определённом контексте . В аспекте взаимодействия программной системы с внешним миром можно выделить два важных контекста — запрос и сеанс.
Запрос (request) соответствует отдельно взятому обращению к системе со стороны внешнего субъекта-клиента.
Сеанс (session) — это долговременный процесс взаимодействия клиента и сервера.
Модель многопоточного программирования обеспечивает высокий уровень использования вычислительных ресурсов благодаря возможности формирования многочисленных потоков в русле единого процесса.
Процесс (process) — это всеобъемлющий контекст выполнения, обеспечивающий высокий уровень изоляции охватываемых им данных от внешнего мира.
Поток вычислений (thread) — более "легковесный" активный агент; в контексте одного процесса может функционировать целое множество потоков.
При работе с системой баз данных следует различать еще один важный контекст выполнения — контекст транзакции (transaction). Транзакции способны соединять в себе несколько запросов, которые клиенту хотелось бы трактовать как единый запрос.
Проблемы параллельного выполнения программ известны уже давно, и за это время предложено немало вариантов их решения. Для корпоративных приложений особенно важны два решения:
- поддержка изолированности (isolation) - организация данных таким образом, чтобы к любому их элементу мог адресоваться только один агент.
- и обеспечение устойчивости (immutability) данных - если определить некоторые порции данных как устойчивые или, по меньшей мере, устойчивые в продолжение некоторых периодов, можно ослабить ограничения параллельного доступа.
Еще одна альтернатива — отделить приложения, функционирующие в режиме "только для чтения", от всех остальных и заставить их работать с копиями источников данных, что значительно упростит логику управления доступом.
Существует два вида стратегий управления параллельными заданиями — оптимистические (optimistic) и пессимистические (pessimistic). Стратегии удобно воспринимать следующим образом: оптимистическое блокирование дает возможность обнаруживать конфликты, в то время как пессимистическое позволяет их предотвращать.
Главное, что следует учитывать, осуществляя выбор между оптимистическим и пессимистическим блокированием, — это частота возникновения и степень опасности конфликтов. Если конфликты относительно редки или их последствия незначительны, обычно разумно предпочесть оптимистическую стратегию, поскольку она обеспечивает высокий уровень параллелизма операций и более проста в реализации. Если же конфликты грозят головной болью, уместнее избрать технологию пессимистического блокирования.
Транзакция — основной инструмент управления параллельными процессами в корпоративных приложениях. Транзакция представляет собой ограниченную последовательность действий с явно определенными начальной и завершающей операциями .
Свойства транзакций :
- Atomicity (атомарность)
- Consistency (согласованность)
- isolation (изолированность)
- Durability (устойчивость)