Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СУБД.doc
Скачиваний:
1
Добавлен:
25.11.2018
Размер:
183.81 Кб
Скачать

Проблема исчезающих значений

Даже в случае, когда соответствующая модификация базовых таблиц может быть произведена, она не всегда может отражаться в представлениях.

create view Казанские_покупатели as

select * from Customer

where city=’Казань’

insert into Казанские_покупатели (Id, name) values (5, ‘Сидоров’);

Эта команда добавит в таблицу Customer запись с указанными значениями полей и значением поля city=null. Последующая выборка отметёт добавленную запись как не удовлетворяющую условию (city=’Казань’). Подобные коллизии частично решаются с помощью опции [with check option], которая отвергает изменение и добавление записей, не удовлетворяющих условию where. Полностью проблема не решена.

create view Казанские_покупатели1 as

select Id, name

from Customer

where city=’Казань’

with check option

insert into Казанские_покупатели1 (Id, name) values (5, ‘Сидоров’);

Помимо фундаментальной роли в определении логики в программной системе понятие представления служит для сокрытия реальной структуры БД, но и сокрытия реальных источников данных, которые могут быть как локальными (хранимыми на клиентском компьютере), так и удалёнными (на сервере). Этот факт используется для создания прототипа системы «клиент-сервер», безопасного в процессе отладки для реальных данных на сервере.

Клиент Сервер

Копия структуры

Строим представления, базирующиеся на локальной копии. После отладки превращаем локальные представления в удалённые переменной значений ссылок. Этот процесс, очевидно, может быть автоматизирован. Этот процесс называется наращиванием БД (upsizing).

Введённое ранее понятие целостности данных – частный, но важный случай общего понятия безопасности данных, который подразумевает включение в рассмотрение не только логической схемы самой БД, но и всех аспектов её использования – от физического размещения до определения прав пользователей. Этот круг вопросов относят к администрированию БД.

Одним из наиболее важных аппаратов обеспечения безопасности данных является механизм поддержки транзакции.

Транзакции

Транзакция – это логически единая операция по модификации базовых таблиц, состоящая из одной или нескольких команд СУБД и переводящая таблицы БД одного корректного (целостного), с точки зрения предметной области, состояния в другое, также корректное.

Здесь подчёркивается разница между реальными командами модификации (insert, update, delete), изменяющими записи одной таблицы, и логическими преобразованиями, сохраняющими исходные отношения связей между таблицами.

Понятие транзакции при таком определении соответствует понятию процедуры, а точнее его обобщение, мотивируемое новыми по сравнению с обработкой оперативной памяти обстоятельствами. Транзакции могут не выполняться (процедуры тоже, но это обстоятельство в процедурном программировании игнорируется). Такими обстоятельствами могут быть не только перебои питания и другие ошибки и исключительные ситуации, но и вполне нормальная работа в среде распределённых параллельных вычисления такой, как многопользовательская система архитектуры «клиент-сервер».

Select-запрос

Результаты выборки

Модификации

Примеры.

  1. Один клиент читает данные в момент модификации таблиц другим клиентом.

  2. Один пользователь удаляет записи таблицы, другой изменяет их значения.

Транзакция – изначально финансовый термин (другой вариант – трансакция), а именно –банковская сделка, перевод денег с нескольких счетов на несколько.

Обе операции могут осуществляться параллельно, или асинхронно, но важно, чтобы они выполнялись полностью, либо не выполнялись вообще.

Характеристическими свойствами транзакции считают свойство ACID (Atomicity, Consistency, Isolation, Durability) – атомарность, непротиворечивость, изолированность и стойкость (жизнеспособность). Под атомарностью понимают принцип «Всё или ничего» (не навреди). Все вовлечённые в транзакции изменения либо происходят целиком, либо не происходят вообще. Непротиворечивость означает, что изменения в любом случае приводят к корректному состоянию. Под изолированностью понимают то, что транзакции могут быть вложенными, но не пересекаться. Жизнеспособность означает, что подтверждённые результаты транзакции не могут быть отлажены никаким внешними воздействиями.

Это определение требует коренного пересмотра базовых для нас понятий:

1) Понятия состояний: состояние программы теперь не определяет однозначно результат;

2) Понятия процедуры как единоличного акта управления, не зависящего от времени и любых внешних воздействий.

F(S) – процедура на состояние S.

F(S)=F(S,X), где Х – скрытый фактор внешней среды.

X: F(S)F(S,X)

(S,X) – состояние вычислительной среды, однозначно определяющее результат.

F(S), если F(S)=F(S,X)

Transaction(F,S,X)=

S, в противном случае

В SQL транзакция оформляется с помощью команд-скобок:

begin [transaction]

команды SQL (в том числе вложенные транзакции)

endcommit [transaction]

Если по каким-либо причинам выполнение команд транзакции невозможно, происходит автоматический откат в состояние на момент её начала. Такой же откат может быть произведён явно с помощью команды RollBack [transaction].

Такой механизм поддержки транзакций скрывает очень сложную низкоуровневую реализацию, основанную на двух важнейших для многопользовательских СУБД понятий: буферизация и блокирование. Буферизация означает, что в реальности модификация производится не над самими таблицами БД, а над их копиями в буфере (точнее над результатами некоторой выборки), затем производится блокировка – запрет на модификацию оригиналов другими пользователями. Если блокировка удачна, то есть оригиналы не заблокированы другими пользователями, содержимое буфера записывается в оригиналы. В противном случае оригиналы остаются неизменными.