- •Шехтман в. Е.
- •1. Базы данных и модели данных
- •1.1. Введение.
- •1.2. Файлы операционной системы
- •1.3. Пример базы данных.
- •1.4. Иерархическая модель данных
- •1.5. Сетевая модель данных
- •1.6. Инвертированные списки.
- •2. Введение в реляционную модель данных.
- •1.7. Реляционная модель данных
- •3. Реляционная алгебра
- •3.1. Теоретико-множественные операции.
- •3.2. Специальные операции ra
- •4. Нормализация данных
- •4.1. Полная декомпозиция.
- •Магазин товар ндс
- •Товар ндс
- •Магазин ндс
- •Товар ндс
- •Магазин товар ндс
- •4.2. Проблема дублирования данных.
- •1 Глобус 33-33-33
- •2 Глобус 33-33-33
- •4 Океан 77-77-77
- •4.3. Висячие записи.
- •Поставщик Тел
- •4.4. Проблемы, возникающие из-за неудачной структуры данных.
- •4.5. Пятая нормальная форма (5нф).
- •4.6. Функциональная зависимость.
- •4.7. Связь между фз и полной декомпозицией отношения.
- •4.8. Первая нормальная форма (1нф).
- •4.9. Вторая нормальная форма (2нф).
- •4.10. Третья нормальная форма (3нф).
- •4.11. Нормальная форма Бойса-Кодда (нфбк).
- •4.12. Многозначная зависимость.
- •4.13. Четвертая нормальная форма (4нф).
- •4.14. Пример нормализации.
- •4.15. Резюме. Нормальные формы.
- •5. Инфологическое моделирование.
- •5.1. Сущность и набор сущностей
- •5.2. Связи между сущностями.
- •5.3. Рекурсивная связь. Роли.
- •5.4. Множественные связи.
- •5.5. Суперсущности и производные сущности
- •5.6. Слабые наборы сущностей
- •5.7. Борьба с избыточнотью
- •5.8. Преобразование инфологической модели в физическую модель.
- •5.9. Пример инфологического моделирования.
- •6. Язык sql
- •6.1. История sql.
- •6.2. Структура sql.
- •6.3. Язык запросов
- •6.4. Простые запросы на выборку данных.
- •6.5. Агрегатные (групповые) функции.
- •6.6. Вложенные запросы
- •6.7. Внешние объединения
- •6.8. Изменение данных
- •Insert into r1 (o, fio, d) values (5, ‘Иванов’, ’бд’)
- •7. Представления.
- •8. Определение схемы базы данных и ограничений целостности
- •9. Транзакции
- •9.1. Свойства транзакций
- •9.2. Надежное хранение данных
- •9.3. Параллельное выполнение транзакций
- •9.3.1. Коллизия “пропавшие изменения” - lost update problem
- •9.3.2. Коллизия “промежуточные данные” - dirty read
- •9.3.3. Коллизия “Несогласованные данные” - unrepeatable read, inconsistent analysis
- •9.3.4. Коллизия “фантом” - phantom
- •9.4. Уровни изолированности
- •9.5. Тупики
- •10. Ограничение прав доступа в целях обеспечения безопасности
- •11. Физическая организация баз данных
- •11.1. Организация размещения данных.
- •11.2. Организация индексов
- •11.2.1. Поиск в бд.
- •11.2.2. Плотный индекс (индексно-прямые файлы).
- •11.2.3. Неплотный индекс (индексно-последовательные файлы).
- •11.2.4. Сбалансированные деревья.
- •11.2.5. Инвертированные списки.
- •12. Архитектура субд. Методы оптимизации запросов.
- •Логические преобразования запросов.
- •Преобразования запросов с изменением порядка реляционных операций.
- •13. Аналитические системы.
- •Анализ данных.
- •Хранилища данных
- •Типы ошибок
- •Способы реализации olap.
- •Требования к средствам реализации систем оперативной и аналитической обработки данных
- •Многомерная модель данных.
- •Разработка данных
- •14. Загружаемые процедуры.
- •In pr double precision)
- •If eof then leave Cl end if;
- •Insert into providers(code, name)
- •Values (nr.Codec, ‘*** новый поставщик ***’);
- •15.4. Модель сервера приложений (трёхзвенная архитектура, “тонкий клиент”)
- •Список литературы
- •15. Модели совместного доступа к бд
- •15.1. Файл-серверная модель.
- •15.2. Модель клиент-сервер с бизнес-логикой на клиенте.
- •15.3. Модель клиент-сервер с бизнес-логикой на сервере субд (хранимые процедуры и триггеры) и частично на клиенте.
9.3.3. Коллизия “Несогласованные данные” - unrepeatable read, inconsistent analysis
Приложение, в котором выполняется транзакция 1, изменяет запись, уже прочитанную приложением, в котором выполняется транзакция 2.
1 транзакция |
2 транзакция |
Пояснение |
|
10 |
Видимый остаток |
10 |
|
Видимый остаток |
-6 |
|
Изменяет кортеж, уже прочитанный вторым оператором |
COMMIT |
|
|
4 |
4 |
Видимый остаток вторая Т видит теперь 4, а не 10, хотя только что было 10. Коллизия т. к. 1 Т изменила запись, уже прочитанную 2 Т. |
9.3.4. Коллизия “фантом” - phantom
Длительная транзакция читает кортеж в начале и в конце и получает разный набор записей данных. В случае коллизии типа “фантом” это связано не с изменением другим пользователем уже прочитанного в ходе транзакции значения (как в случае коллизии несогласованного чтения), а с тем, что появляются новые записи в таблице, которую транзакция может читать несколько раз. (Считаем, что однажды считанное значение при повторном считывании не изменяется – т. е. нет проблемы несогласованных данных.)
Вообще говоря, желательно, чтобы:
в ходе транзакции пользователь видел только согласованные данные, а не промежуточные.
при параллельном выполнении двух транзакций СУБД должна гарантировать, что результаты были такие же, как при последовательном выполнении.
Для обозначения совокупности этих условий применяется термин сериализация транзакций.
9.4. Уровни изолированности
В SQL определены 4 уровня изолированности транзакций, которые выражают условия взаимодействия параллельных транзакций и определяют, что позволено, а что запрещено в ходе транзакций. То, как СУБД осуществляет эти условия, в стандарте SQL не описано. Более того, каждая СУБД может это делать по-своему.
-
Уровень
изолированности
Описание
0
Нет коллизии lost update problem (одни данные может изменять только одна транзакция, другая должна ждать)
1
Нет коллизии dirty read (при изменении данных они должны блокироваться чтобы никто не мог их прочитать, читающие транзакции должны ждать)
2
Нет коллизии unrepeatable read (при чтении данных никто не может их изменить, если они изменяются то никто не должен их читать)
3
Нет коллизии phantom (при выборке по условию никто не должен изменять или вставлять данные по этому условию)
Уровни изолированности транзакций (согласно SQL-92) определяются оператором:
SET TRANSACTION ISOLATION LEVEL <n> [{READ WRITE | READ ONLY}]
-
<n>
Уровень изолированности
READ UNCOMMITTED
0
READ COMMITTED (по умолчанию в MS SQL Server)
1
REPEATABLE READ (по умолчанию в Interbase Server)
2
SERIALIZABLE
3
Пример.
Воспользуемся торговой базой данных (см. главу 8) для иллюстрации параллельного выполнения транзакций и анализа эффекта выбора того или иного уровня изоляции транзакций.
Пусть таблица SUPPLIES имеет следующие данные по бананам соответсвующих поставщиков и дат:
PRICE |
30 |
31 |
29 |
28 |
Рассмотрим взаимодействие во времение двух программ. Первая программа выясняет, по каким максимальной и минимальной ценам поставлялись бананы:
(1) SELECT MAX(PRICE) FROM SUPPLIES WHERE CODEG=<код бананов>
(2) SELECT MIN(PRICE) FROM SUPPLIES WHERE CODEG=<код бананов>
В это время другая программа устраняет ошибочно введенные данные о поставках бананов и вводит правильные:
(1’) DELETE FROM SUPPLIES WHERE CODEG=<код бананов>
(2’) INSERT INTO SUPPLIES (CODEG, CODEC, DAT, WEIGHT, PRICE) VALUES (<код бананов>, <код поставщика>, <дата>, <вес>, 27)
Подчеркнем, что выбор уровня изоляции – это частный выбор каждой из программ. Он определяет, как именно эта программа будет видеть данные, а не то, как их будут видеть другие программы.
Предположим, что вторая программа всегда выполняется на уровне изолированности SERIALIZABLE.
Если первая программа выполняется на уровне изолированности READ UNCOMMITED, то она может вообще не получить никаких данных. Это случится, если ее транзакция начнется и закончиться после окончания (1’), до начала (2’): (1’) (1) (2) (2’). Результат при этом будет: (MIN=NULL, MAX=NULL).
Если первая программа выполняется с уровнем изолированности транзакции READ COMMITED, то она может увидеть только подтвержденные данные, но не обязательно одни и теже. Так, при последовательности (1) (1’) (2’) (2) результат окажется следующим: (MIN=28, MAX=27)!
Если первая программа выполняется с уровнем изолированности транзакции REPEATABLE READ, то для нее ситуация похожа на предыдущий случай, но в дополнение к нему, все, что было прочитано операцией (1), будет видно и в ходе выполнения операции (2). (Даже если к этому времени зафиксирована транзакция, убравшая все записи из базы данных.) Однако могут появиться дополнительные записи. При последовательности (1) (1’) (2’) (2) ответ окажется таким (MIN=28, MAX=30). Это происходит потому, что операция (2), кроме новой записи, вставленной операцией (2’) увидит и все те записи, которые были до выполнения операции (1’).
Если первая программа выполняется с уровнем изолированности SERIALIZABLE, то результат будет основан на данных либо до (1’)(2’) либо после этой транзакции. Но данные в ходе выполнения этой последовательности (второй программы) никак не повлияют на результат. Итак, ответ буде либо (MIN=25, MAX=30) либо (MIN=27, MAX=27)
Подчеркнем, что реализация каждого из уровней изоляции дается на откуп конкретной СУБД. Так, для уровня SERIALIZABLE СУБД может выполнить настоящую изоляцию во времени (т. е. выполнить транзакции строго последовательно), а может и сохранять старые данные для предоставления их параллельным транзакциям. Больше того, в конкретной СУБД некоторые уровни изолированности могут и не быть реализованы.
Методы устранения коллизий совместного доступа (иначе говоря, методы изоляции транзакций):
Строго последовательное выполнение. Этот метод является самым простым, но крайне неэффективным по времени выполнения совокупности транзакций.
Блокировка (синхронизационный захват объекта). Наиболее применим в современных коммерческих СУБД. Однако в рамках этого метода возможны различные стратегии, менее или более сложные. Так, исключительная блокировка таблицы, вовлеченной в транзакцию на все время выполнения транзакции, часто приводит к тому же эффекту, что и первый метод. Поэтому применяются блокировки не таблицы целиком, а только тех страниц (диковых блоков), в которых располагаются записи таблицы, вовлеченные в транзакцию. Некоторые СУБД допускают блокировку отдельных записей, что является еще более мягким условием. Кроме того, применяются и разные типы блокировок. Совместные, разделяемые (shared) блокировки – объекты, заблокированные таким образом допускают чтение разными транзакциями. Монопольные (exclusive) блокировки – объекты, заблокированные таким образом, не доступны до момента окончания транзакции, повлекшей блокировку и применяются при необходимости изменить, вставить или удалить данные.
Поддержка множественных версий записей.
Автоматическая транзакция, явная транзакция, вложенные транзакции, распределенные транзакции (двухфазный COMMIT).!!!!!!!!!!!!!!!!!!!!!!
Грануляция блокирования
RID – строка таблицы
Key – диапазон индекса (для решения проблемы фантомов) – на условие WHERE
Page – страница (4K)
Extent – экстент – 8 страниц
Table –таблица и её индексы
DB – база данных
Блокировка на уровне команды (SELECT, UPDATE, INSERT, DELETE):
SELECT NAME FROM DIAG WITH (<n>) WHERE PARENT=5
<n> := [ROWLOCK, PAGLOCK, TABLOCK, TABLOCKX, HOLDLOCK (до конца транзакции а не на операцию),
UPDLOCK (блокировка изменений но не чтения),
NOLOCK, READUNCOMMITED (0 Level, только SELECT),
REPEATABLEREAD. SERIALIZABLE, READPAST (чтение с пропуском строк, блокированных другими транзакциями)]
