190 likes | 481 Views
1. Транзакции. Неделимой операцией в БД считается выполнение одного SQL- запроса (может быть, включающего выполнение хранимой процедуры, исполнение каскадных действий и триггеров). На самом деле можно рассматривать три режима исполнения предложений:.
E N D
1. Транзакции Неделимой операцией в БД считается выполнение одного SQL-запроса (может быть, включающего выполнение хранимой процедуры, исполнение каскадных действий и триггеров). На самом деле можно рассматривать три режима исполнения предложений: • Автоподтверждение (транзакцией является каждое предложение,как описано выше). • Неявное начало транзакций, явное подтверждение. • Явное начало и подтверждение транзакций. MS SQL Server: • BEGIN TRANSACTION – явное начало транзакции • COMMIT TRANSACTION – завершение транзакции • ROLLBACK TRANSACTION – отмена транзакции • SET IMPLICIT_TRANSACTIONS ON | OFF – включение/выключениережима неявного начала транзакций Базы данных: учебный курс
Примеры • Нужно однократно исполнить несколько предложений в рамках однойтранзакции. BEGIN TRANSACTION INSERT Tab1 (Field1, Field2) VALUES ('Val1', 'Val2') INSERT Tab1 (Field1, Field2) VALUES ('Val3', 'Val4')COMMIT TRANSACTION • Хочется явно отмечать конец каждой транзакции, не задавая явноее начало каждый раз. SET IMPLICIT_TRANSACTIONS ON INSERT Tab1 (Field1, Field2) VALUES ('Val1', 'Val2')INSERT Tab1 (Field1, Field2) VALUES ('Val3', 'Val4')COMMIT TRANSACTION INSERT Tab1 (Field1, Field2) VALUES ('Val5', 'Val6')INSERT Tab1 (Field1, Field2) VALUES ('Val7', 'Val8')COMMIT TRANSACTION SET IMPLICIT_TRANSACTIONS OFF Базы данных: учебный курс
Вложенные транзакции BEGIN TRANSACTION {SQL-предложение 1} {SQL-предложение 2} BEGIN TRANSACTION {SQL-предложение 3} IF (условие) THEN {SQL-предложение 4} COMMIT TRANSACTION ELSE ROLLBACK TRANSACTION {SQL-предложение 5} COMMIT TRANSACTION Базы данных: учебный курс
Транзакции в JDBC Управление режимом транзакций – методы интерфейса Connection Connection conn = DriverManager.getConnection(...); conn.setAutoCommit(false); for(int i = 0; i < 10; ++i) { insertData(someTable, someData); updateData(someOtherTable, someOtherData); conn.commit(); } conn.setAutoCommit(true); Базы данных: учебный курс
JDBC – отмена транзакции Connection conn = DriverManager.getConnection(...); conn.setAutoCommit(false); try { for (int i = 0; i < 10; ++i) { insertData(someTable, someData); } } catch (Exception x) { conn.rollback(); } finally { conn.commit(); } conn.setAutoCommit(true); Базы данных: учебный курс
Механизм «точек состояния» в JDBC Вместо вложенных транзакций в JDBC можно использовать «точки состояния». Savepoint svp1 = conn.setSavepoint("name1"); Объекты типа Savepointобладают числовым идентификатороми могутиметь имя. String s = svp1.getSavepointName(); int id = svp1.getSavepointId(); Создадим внутри выполняемой транзакции две точки сохранения. Savepoint svp1 = conn.setSavepoint(); Savepoint svp2 = conn.setSavepoint(); Тогда можно выполнить следующие действия: conn.rollback(svp1); // откат транзакции к svp1; // svp2 "освобождается" conn.commit(); // все точки сохранения освобождаются conn.releaseSavepoint(svp2); // "освобождение" точки svp2 conn.rollback(); // отмена транзакции и освобождение всех svp Базы данных: учебный курс
Уровни поддержки изолированности транзакций Запросить уровень поддержки изолированности транзакции можно так: int level = conn.getTransactionIsolation(); Connection.TRANSACTION_NONE – транзакции не поддерживаются; Connection.TRANSACTION_READ_UNCOMMITTED – транзакции поддерживаются, но при чтении данных одной транзакцией могут быть видны результаты работы незавершенной другой транзакции. Connection.TRANSACTION_READ_COMMITTED – транзакции поддерживаются и результаты работы транзакций не видны извне, пока транзакция не завершена. Connection.TRANSACTION_REPEATABLE_READ Connection.TRANSACTION_SERIALIZABLE Можно попробовать установить желаемый уровень изолированности: conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); Базы данных: учебный курс
2. Права пользователей Поддержка прав пользователей ведется только на уровне самой БД, В JDBC нет никаких средств для работы с правами пользователей. • Основные понятия: • Право на определенное действие с определенным объектом; • Роль – совокупность прав; • Пользователь (user) – исполнитель некоторой совокупности ролей; • Креденциал (login + password) – право на вход в систему под именемтого или иного пользователя. • Примеры: • Право вставлять(INSERT) новые записи в определенную таблицу;право добавлять(CREATE) новые таблицы в базу данных (database). • Владелец БД (owner);Администратор БД (admin); Программист. • Иванов – программист и руководитель проектов; Петров – тестировщик. • sa – имя администратора БД; dbo – стандартное имя владельца. Базы данных: учебный курс
Передача и отзыв прав Есть несколько SQL-предложений, позволяющих передать или отозватьопределенные права пользователям или ролям. Разумеется, для того,чтобы можно было исполнить такое SQL-предложение, исполнитель долженобладать правом на передачу прав. Примеры: GRANT SELECT ON OBJECT::projects TO vasja WITH GRANT OPTION GRANT EXECUTE ON OBJECT::myproc TO programmer REVOKE EXECUTE ON OBJECT::myproc FROM programmer CASCADE REVOKE ALTER ON OBJECT::projects FROM programmer Базы данных: учебный курс
3. Нормализация данных Основная задача – облегчить поддержание целостности данных. • Проблемы: • При изменении одной записи может потребоваться внести измененияи в другие, вообще говоря, независимые от нее записи. • При удалении данных может быть удалена информация, которую,вообще говоря, желательно было оставить. • При добавлении данных может потребоваться вводить неопределенныезначения, необходимость которых сомнительна. Говорят, что в БД могут иметь место «аномалии изменения», «аномалии добавления» и «аномалии удаления». • Дополнительные цели, преследуемые нормализацией: • Уменьшить объем таблиц, исключив дублирование данных. • Обеспечить быстрый доступ к данным, упростив их структуру. Базы данных: учебный курс
Пример аномалий при изменении данных Рассмотрим таблицу участия программистов в проекте: Аномалия изменения: При изменении «Вася» на «Василий» требуется отследить все вхождения«Васи» в атрибуте «Участник» и, возможно, «Руководитель». Аномалия добавления: При добавлении нового проекта необходимо определить хотя бы одногоучастника проекта или оставить некоторые поля неопределенными. Аномалия удаления: При удалении «Пети» как участника проекта «P1» исчезает информацияи о самом сотруднике и о роли «Тестер». Базы данных: учебный курс
Нормальные формы и разделение таблиц Процесс нормализации – это, в основном, процесс разделения таблиц на независимые таблицы без потери информации. «Без потери информации» означает, что исходную таблицу всегда можно восстановить, выполнив некоторое «соединение» (JOIN) получившихся В результате разделения меньших таблиц. • Разделение таблиц приводит к: • уменьшению зависимости между элементами одной записи; • уменьшению размеров самих таблиц; • уменьшению количества дублирующей информации; • увеличению гибкости в формировании результатов запросов. • Различают несколько «нормальных форм» данных, которые определяются, • прежде всего, уровнем зависимости между значениями атрибутов в одной • таблице (или записи). • 1НФ; 2НФ; 3НФ; НФБК – традиционные, хорошо изученные НФ; • 4НФ; 5НФ – формы, введенные для того, чтобы избежать некоторых достаточно редких аномалий; • 6НФ; 7НФ – крайне редко используемые нормальные формы. Базы данных: учебный курс
Первая нормальная форма Первая нормальная форма: атрибуты атомарны и каждая таблица имеет по крайней мере один потенциальный ключ. • Формально в реляционных БД данные всегда находятся в 1НФ, однако, • на практике возможны следующие ситуации, когда все же требуетсянекоторое «приведение» к 1НФ: • в таблице имеются повторяющиеся записи (надо либо удалить дубликаты, либо правильно проидентифицировать их. Базы данных: учебный курс
Первая нормальная форма • Еще одна ситуация, когда требуется приведение к 1НФ: • в таблице имеются составные атрибуты. На практике это не всегда «правильное» преобразование. В данном случае разделение атрибутов привело к дублированию данных. Базы данных: учебный курс
Вторая нормальная форма • Данные находятся во второй НФ, если они: • находятся в 1НФ; • никакой атрибут не находится в полной функциональной зависимостиот первичного ключа. Первичный ключ – Фамилия + Должность; Зависимость: Должность Зарплата Базы данных: учебный курс
Третья нормальная форма • Данные находятся в третьей НФ, если они: • находятся во 2НФ; • Всякий неключевой атрибут находится в функциональной зависимоститолько от первичного ключа. Первичный ключ – ID; Зависимость: Комната Телефон Базы данных: учебный курс
Нормальная форма Бойса-Кодда • Данные находятся в НФБК, если они: • находятся в 3НФ; • нет неключевых атрибутов, находящихся в функциональной зависимостиот отдельных полей первичного ключа. Потенциальный ключ – ID + Проект Зависимость: IDФамилия Базы данных: учебный курс
Заключение • Обычно полагают, что данные «хорошо нормализованы», если онинаходятся в НФБК (которую часто называют третьей НФ); • Иногда требуется приведение к нормальным формам более высокогопорядка (удаление более сложных зависимостей для облегченияподдержания целостности данных); • Часто носле нормализации БД разбивается на большое количествотаблиц с маленьким числом атрибутов. Это не всегда удобно, так кактребует составления сложных запросов для извлечения данных. Еслиподдерживать целостность не слишком сложно (например, путемопределения подходящих триггеров), то иногда имеет смысл провестиденормализацию данных. Базы данных: учебный курс