БД Oracle разработана как многопользовательская БД. БД должна гарантировать, что несколько пользователей могут работать одновременно, не повреждая данные друг друга.
Транзакция – это логическая атомарная единица работы, содержащая один или несколько операторов SQL.
РСУБД должна иметь возможность группировать инструкции SQL таким образом, чтобы они были либо все зафиксированы, что означает, что они применяются к базе данных, либо все откатаны, что означает, что они отменены.
Иллюстрацией необходимости транзакций является перевод средств со сберегательного счета на расчетный счет. Передача состоит из следующих отдельных операций:
БД Oracle гарантирует, что все три операции будут успешными или завершатся неудачей как единое целое. Например, если аппаратный сбой препятствует выполнению инструкции в транзакции, то другие инструкции должны быть откатаны.
Транзакции – это одна из функций, которая отличает БД Oracle от файловой системы. Если вы выполняете атомарную операцию, которая обновляет несколько файлов, и если система выходит из строя на полпути, то файлы не будут согласованы. Напротив, транзакция переводит БД Oracle из одного согласованного состояния в другое. Основной принцип транзакции – “всё или ничего”: атомарная операция завершается успешно или терпит неудачу в целом.
Требованием многопользовательской РСУБД является контроль параллелизма данных, который заключается в одновременном доступе к одним и тем же данным несколькими пользователями.
Без контроля параллелизма пользователи могут изменять данные ненадлежащим образом, ставя под угрозу целостность данных. Например, один пользователь может обновить строку, в то время как другой пользователь одновременно обновляет её.
Если несколько пользователей получают доступ к одним и тем же данным, то один из способов управления параллелизмом – заставить пользователей ждать. Однако цель СУБД – сократить время ожидания, чтобы оно либо отсутствовало, либо было незначительным. Все инструкции SQL, изменяющие данные, должны выполняться с минимальным вмешательством, насколько это возможно. Необходимо избегать деструктивных взаимодействий, которые представляют собой взаимодействия, которые неправильно обновляют данные или изменяют базовые структуры данных.
БД Oracle использует блокировки для управления одновременным доступом к данным. Блокировка – это механизм, который предотвращает деструктивное взаимодействие между транзакциями, обращающимися к общему ресурсу. Блокировки помогают обеспечить целостность данных, обеспечивая при этом максимальный одновременный доступ к данным.
В БД Oracle каждый пользователь должен видеть согласованное представление данных, включая видимые изменения, внесенные собственными транзакциями пользователя и зафиксированными транзакциями других пользователей.
Например, БД должна предотвращать проблему грязного чтения, которая возникает, когда одна транзакция видит незафиксированные изменения, внесенные другой параллельной транзакцией.
БД Oracle всегда обеспечивает согласованность чтения на уровне инструкций, что гарантирует, что данные, возвращаемые одним запросом, зафиксированы и непротиворечивы в течение одного момента времени. В зависимости от уровня изоляции транзакции, этот момент является временем, в которое была открыта инструкция, или временем начала транзакции. Функция запроса Oracle Flashback Query позволяет явно указывать этот момент времени.
БД также может обеспечивать согласованность чтения для всех запросов в транзакции, известную как согласованность чтения на уровне транзакции. В этом случае каждый оператор в транзакции видит данные из одного и того же момента времени, который является временем начала транзакции.