Для того, чтобы разрешить возможные коллизии и создать у пользователей иллюзию их «единственности», в СУБД HyTech используется механизм «фотографий» (мгновенных снимков) состояния БД.
При выполнении первого атомарного запроса из всей группы поисковых операций состояние таблицы «фотографируется». Последующие операции, используя этот «снимок», выполняют поиск для того же состояния БД, которое было на момент первого запроса. Все внесенные другими пользователями изменения «не видны» для данного пользователя. Это позволяет завершить всю сколь угодно длинную цепочку поисковых запросов без нарушения логической целостности.
Для каждой открытой таблицы и для каждого пользователя хранится текущий снимок состояния таблицы. Снимок делается автоматически (при первом поиске по таблице) или при явном вызове функции htMakePhoto.
Текущий снимок можно отменить с помощью оператора fix.Операции, закрывающие доступ к таблице (например, close table), также отменяют текущий снимок. Для таблиц, которые включены в транзакцию, механизм снимков отключается. Для временных таблиц механизм снимков также отключается.
Создание снимка не захватывает таблицы в монопольное пользование. Другие пользователи могут продолжать работать с этими же таблицами.
SQL оператор fix table отменяет текущий снимок у указанной таблицы. При очередном поиске по данной таблице будет сделан новый снимок состояния.
Формат:
fix table Имя_таблицы;
Аргументы:
Аргумент
Значение
Имя_таблицы
Задает имя таблицы, текущий снимок которой надо отменить. Таблица с указанным именем должна существовать.
Результат выполнения оператора можно проверить, вызвав SQL-функцию lastsqlerr.
Пример:
drop table TEST;
create table TEST ( FIELD1 int );
insert into TEST values (1);
var @i = 0;
while(@i <= 10) { fix table TEST; insert into TEST select * from TEST; @i = @i + 1; }
fix all;
select FIELD1 from TEST;
Если в примере убрать оператор fix table, то оператор insert select будет вставлять по одной записи. Всего будет добавлено 10 записей. Если же есть предыдущие снимки таблицы TEST, то поведение оператора insert select будет непосредственно зависеть от них.
Если оставить оператор fix table, то перед выполнением поиска insert select будет сделан снимок, в который попадут записи, добавленные в предыдущей итерации. В результате выполнения этой программы в таблице будет 1024 записи.
Аналогично fix table, SQL оператор fix all отменяет текущий снимок у всех таблиц пользователя. При очередном поиске по таблице будет сделан новый снимок состояния.
Формат:
fix all;
Результат выполнения оператора можно проверить, вызвав SQL-функцию lastsqlerr.