Максим Чалышев - Oracle SQL. 100 шагов от новичка до профессионала
- Название:Oracle SQL. 100 шагов от новичка до профессионала
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:11
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Максим Чалышев - Oracle SQL. 100 шагов от новичка до профессионала краткое содержание
Более 500 практических заданий.
Более 1000 разобранных примеров.
Учебник справочник по языку SQL.
Oracle SQL. 100 шагов от новичка до профессионала - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Рисунок 219. Выбор данных из таблицы AUTO1
Выберем данные из таблицы AUTO1.
Важные замечания
MERGE является DML-командой, командой управления данными.
Эту команду следует завершать командой COMMIT.
Вместо таблицы INTO можно указать запрос.
Пример
Вопросы учеников
Как добавить или обновить некоторое одиночное значение с помощью MERGE?
Нет ничего проще, можно использовать запрос к таблице DUAL.
Пример
Контрольные вопросы и задания для самостоятельного выполнения
1. Повторите материалы данного шага.
2. Поясните работу оператора MERGE.
3. Обновите данные в таблице MAN1 на основе таблицы MAN с использованием MERGE.
4. Обновите данные в таблице CITY1 на основе таблицы CITY с использованием MERGE.
Шаг 83. Транзакции и блокировки
Введение
Для данного шага нам потребуется установить дополнительное программное обеспечение (ORACLEXE, PL SQL DEVELOPER). Подробнее о том, как устанавливать данные программы, описано в шаге 51 настоящей книги.
Данный шаг посвящен транзакционной модели и работе ORACLE SQL в многопользовательском режиме.
Теория и практика
В ORACLE СУБД используется транзакционная модель.
Изменения в данных, выполненные с помощью операторов INSERT, UPDATE, MERGE, DELETE, необходимо зафиксировать с помощью COMMIT или UPDATE.
Но работа в команде, работа одновременно нескольких пользователей подразумевает возможность одновременного редактирования данных.
Пример для демонстрации работы в многопользовательском режиме.
Создадим таблицу MAN5.
Откроем две программы SQLDEVELOPER независимо друг от друга в двух разных окнах. Либо можно открыть новый SQL WORKSHEET, воспользовавшись кнопкой NEW SHARED SQL WORKSHEET.
Подключимся к пользователю SYS в обоих окнах, как указано в шаге 51.
Заполним новую таблицу данными.
Выполним следующие команды в одном окне SQLDEVELOPER.
Переключим на другое окно программы SQLDEVELOPER.
Напишем запрос:
Запрос вернул пустое множество, переключим окно SQLDEVELOPER.
Уже в этом окне напишем запрос.
Запрос вернул три строки.
Выполним команду COMMIT;
Переключимся на второе окно SQL.
Запрос вернул три строки.
Транзакция — неделимая последовательность из нескольких SQL-команд.
Пользователь делает изменения в своей транзакции, до выполнения команды СOMMIT транзакция не фиксирует изменения в общей базе.
Таким образом, пока изменения не были зафиксированы командой COMMIT, только первый пользователь мог видеть изменения данных, которые он сделал; остальные пользователи базы данных этих изменений не видели.
Команда COMMIT зафиксировала изменения, и они стали доступны другим пользователям базы данных.
Предположим, что пользователь 1 отредактировал данные в некоторой таблице, но не завершил операцию редактирования командой COMMIT;
Одновременно другой пользователь также отредактировал данные и выполнил команду COMMIT; получается, что у пользователя 1 теперь будут некорректные данные?
Для того чтобы избежать подобной коллизии, ORACLE использует механизм блокировок.
Продемонстрируем работу данного механизма.
В первом окне обновим данные следующим запросом:
Во втором окне так выполним соответствующую команду:
Это приводит к длительному зависанию программы и ошибке, данные в таблице не изменились.
Подобная ситуация произошла потому, что при выполнении команд обновления данных в первой сессии установлены блокировки на записи таблицы.
Для того чтобы избежать подобной ситуации, следует предварительно выполнить запрос со специальной директивой FOR UPDATE NO WAIT для таблицы, записи к которой следует обновить.
Повторим наш пример.
В первом окне обновим данные следующим запросом:
Во втором окне так выполним соответствующую команду:
Результат:
ORA-00054: resource busy AND acquire with NOWAIT specified or timeout expired
00054. 00000 — «resource busy AND acquire with NOWAIT specified or timeout expired»
*Cause: INterested resource IS busy.
*Action: Retry if necessary or INcreASe timeout.
Важные замечания
Команды в языке SQL подразделяются на два типа: команды изменения данных и команды описания данных.
К первому типу команд (команды изменения данных) относятся операторы выбора (SELECT), вставки (INSERT, INSERT ALL), обновления данных (UPDATE, MERGE), удаления данных (DELETE).
К командам описания данных относятся команды создания структуры таблиц, изменения структуры таблиц (CREATE TABLE, MODIFY, ALTER TABLE), команды создания индексов и ограничений (CREATE INDEX, CHECK).
Транзакционная модель распространяется только на команды изменения данных, то есть команды вставки, обновления, удаления данных. То есть данные команды должны завершаться специальными операторами COMMIT или ROLLBACK для фиксации изменений в базе данных или отката изменений в базе данных.
Все изменения в базе данных, которые произведены с помощью операторов описания данных (CREATE TABLE, ALTER TABLE…), применяются немедленно.
Также к операторам описания данных можно отнести команду TRUNCATE, которая применяется для быстрой очистки таблицы.
Вопросы учеников
Как посмотреть блокировки с помощью запроса?
Вот пример такого запроса:
Как посмотреть запросом, кто кого блокирует?
Воспользуемся для этого специальным запросом:
Какие права требуются при выполнении данного запроса?
Для этого запроса требуются привилегии на системное представление V$LOCK, которые может выдать администратор базы данных.
Что такое DEADLOCK?
Это нестандартная ситуация в базе данных.
Такая ситуация возникает, когда одна сессия блокирует вторую сессию, а первая сессия, в свою очередь, блокирует первую, то есть это ситуация, когда две сессии взаимно блокируют друг друга.
Пример подобной ситуации:
Как разрешить ситуацию DEADLOCK?
Данную ситуацию сможет корректно разрешить администратор базы данных.
Контрольные вопросы и задания для самостоятельного выполнения
1. Что такое DEADLOCK?
2. Как разрешается ситуация DEADLOCK?
3. Как посмотреть блокировки, кто кого блокирует?
4. Какой избежать ситуации с блокировками?
Шаг 84. Режим SERIALIZABLE
Введение
Как мы убедились на предыдущем шаге, разные пользователи могут видеть разные данные. Однако в СУБД ORACLE есть возможность, чтобы пользователь всегда видел только те данные в таблицах, которые были с начала его сессии.
Теория и практика
Такой режим (уровень изоляции) называется SERIALIZABLE. Для того чтобы включить этот режим, используется команда:
Следующий пример показывает отличие режима SERIALIZABLE от стандартного режима эксплуатации СУБД уровня изоляции READ COMMITTED.
Откроем в двух разных окнах программу SQL DEVELOPER (или создадим новый WORKSHEET), подключимся к схеме SYS как администратор. Как создать такое подключение, подробно описано в шаге 51.
Читать дальшеИнтервал:
Закладка: