Правильный код

Параллельное выполнение операций

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

    Проблемы параллелизма :
  • утраченные изменения (lost updates) - при одновременном изменении более раннее изменение будет утеряно
  • несогласованное чтение (inconsistent read) - возникает в ситуациях, когда считываются две корректные сами по себе порции данных, которые, однако, не могут существовать в один и тот же момент времени
  • потеря достоверности (correctness) - при изменении данных в параллельном выполнении

Все операции, выполняемые системой, протекают в определённом контексте . В аспекте взаимодействия программной системы с внешним миром можно выделить два важных контекста — запрос и сеанс.

Запрос (request) соответствует отдельно взятому обращению к системе со стороны внешнего субъекта-клиента.

Сеанс (session) — это долговременный процесс взаимодействия клиента и сервера.

Модель многопоточного программирования обеспечивает высокий уровень использования вычислительных ресурсов благодаря возможности формирования многочисленных потоков в русле единого процесса.

Процесс (process) — это всеобъемлющий контекст выполнения, обеспечивающий высокий уровень изоляции охватываемых им данных от внешнего мира.

Поток вычислений (thread) — более "легковесный" активный агент; в контексте одного процесса может функционировать целое множество потоков.

При работе с системой баз данных следует различать еще один важный контекст выполнения — контекст транзакции (transaction). Транзакции способны соединять в себе несколько запросов, которые клиенту хотелось бы трактовать как единый запрос.

Проблемы параллельного выполнения программ известны уже давно, и за это время предложено немало вариантов их решения. Для корпоративных приложений особенно важны два решения:

  • поддержка изолированности (isolation) - организация данных таким образом, чтобы к любому их элементу мог адресоваться только один агент.
  • и обеспечение устойчивости (immutability) данных - если определить некоторые порции данных как устойчивые или, по меньшей мере, устойчивые в продолжение некоторых периодов, можно ослабить ограничения параллельного доступа.

Еще одна альтернатива — отделить приложения, функционирующие в режиме "только для чтения", от всех остальных и заставить их работать с копиями источников данных, что значительно упростит логику управления доступом.

Существует два вида стратегий управления параллельными заданиями — оптимистические (optimistic) и пессимистические (pessimistic). Стратегии удобно воспринимать следующим образом: оптимистическое блокирование дает возможность обнаруживать конфликты, в то время как пессимистическое позволяет их предотвращать.

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

Транзакция — основной инструмент управления параллельными процессами в корпоративных приложениях. Транзакция представляет собой ограниченную последовательность действий с явно определенными начальной и завершающей операциями .

Свойства транзакций :

  • Atomicity (атомарность)
  • Consistency (согласованность)
  • isolation (изолированность)
  • Durability (устойчивость)