Создание приложений для работы с базами данных в сети____________581

Databasel->StartTransaction() ;

Группа операторов изменения данных (ExecSQL и др.)

Проверка результатов: Если успешно — Databasel->Conimit();

Если неудача — Databasel->Rollback();

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

Из общих рекомендаций по организации транзакций можно прежде всего от-
метить рекомендацию по возможности сокращать число трансакций. Сокращение
числа трансакций возможно за счет команд SQL групповой обработки записей. На-
пример, при необходимости переименовать подразделение во всех записях табли-
цы можно написать следующий код (предполагается, что мы хотим переименовать
«Цех I» в «Цех 2»):

Tablel->First О ;

while (! Tablel->Eof)
{
if (Tablel->FieldByName("Dep")->AsString == "Цех 2")

Tablel->Edit() ;

Tablel->FieldByName("Dep")->AsString = "Цех I";

t
Tablel->Next() ;

}
Tablel->First() ;

Этот код предполагает осуществление стольких транзакций, в скольких запи-
сях будут сделаны исправления. Для каждого исправления будет генерироваться
своя команда Update. Если ваша база данных большая, то это может привести к
значительным затратам времени и к проблемам на сервере при регистрации тран-
закций. А если во время выполнения цикла возникли какие-то исключительные
ситуации, то часть записей будет изменена, а часть — нет. Последнее можно исп-
равить, поместив перед циклом оператор Start/Transaction. Но неэффективность
выполнения останется.

Более удачным решением в данном случае является выполнение с помощью
Query команды типа:

UPDATE Pers SET Dep='Uex 1' WHERE Dep='Цех 2'

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

Число транзакций сокращается также за счет описанного ранее кэширования
изменений, поскольку в этом случае все локально хранящиеся изменения заносят-
ся в базу данных одной транзакцией.

Наряду с сокращением числа транзакций желательно уменьшать длительность
каждой, поскольку слишком долго выполняемая транзакция может надолго забло-
кировать ресурсы для других приложений. Например, если таблица Pers, с которой
вы работали в предыдущем примере, очень большая, то приведенную выше команду
можно разбить на две, выполняемые в пределах отдельных транзакций:

UPDATE Pers SET Dep='Цех Г
WHERE (Num BETWEEN 1 AND 10000)and(Dep='Цех 2')

и

UPDATE Pers SET Dep='Uex Г
WHERE (Num > 10000)and(Dep='Цех 2')