Транзакция (англ. transaction) - это группа последовательных операций с базой данных, которая представляет собой логическую единицу работы с данными. Транзакция может быть выполнена полностью и успешно, сохраняя целостность данных и независимо от транзакций, которые выполняются параллельно, или же не выполнена вообще, в таком случае она не должна вызвать никаких изменений.
Начиная с 7-мой версии, в Drupal появилась возможность поддержки транзакций, включая базы данных, которые их не поддерживают. Однако, если попытаться выполнить две транзакции одновременно, то их выполнение может стать сложным. В этом случае их поведение будет зависеть от типа базы данных.
Такая же проблема возникает с вложенностью и в C/C++. Если код уже заблокировал таблицу A и попытается заблокировать ее повторно, то вы попадете в тупик. Если вы напишете код, который будет проверять, нет ли блокировки, и только при её отсутствии повторять попытку, то таких недоразумений можно будет избежать. Однако, это может привести к преждевременному снятию блокировки.
В SQL существует аналогичная проблема. Если, например, ваш код выполняется в транзакции и в этот момент начинается новая, то мы можем получить непредсказуемый результат выполнения текущей операции и начала новой.
Java подошла к проблеме вложенности с блокировкой иным образом. Реализуя поддержку вложенности структуры, Java позволяет обозначить функции как "синхронизированные", что заставляет последнюю либо ждать до тех пор, пока блокировка станет возможной, либо снять блокировку, когда она больше не нужна.
Хотя просто прописать функцию "транзакция" в PHP невозможно, однако можно следовать логике вложенности Java с помощью объектов из конструкторов и деструкторов. С этой целью в Drupal был разработан класс-оболочка для создания и управления транзакциями в базах данных - class DatabaseTransaction
Он используется в функции "$txn = db_transaction(); в качестве первой операции, чтобы сделать текущую функцию, в которой она вызывается, транзакцией.
