1. Метод выхода
Первоначально я думал, что процесс завершится сразу после выполнения метода Exit, но я передумал после того, как создал пример для его тестирования. Пожалуйста, посмотрите на это
Например, флагу наконец присвоено значение «C».
=============================================== ============================================
вар
флаг: строка;
начинать
пытаться
флаг := 'А';
Выход;
флаг := 'B';
окончательно
флаг := 'C';
конец;
флаг := 'D';
конец;
=============================================== ============================================
Анализ: независимо от того, как заканчивается предложение try, предложениеfinally всегда выполняется. (Спасибо, ylmg, пользователь сети)
2. Небольшая проблема, которая может привести к остановке всей системы.
При проектировании системы баз данных для обеспечения целостности данных часто используются операции транзакций. Однако неправильное проектирование может легко иметь относительно серьезные последствия. Следующий пример показывает, что, хотя целостность данных гарантирована, система может полностью перестать функционировать.
=============================================== ============================================
AdoConnection1.BeginTrans;
пытаться
...
if application.MessageBox('Вы уверены, что хотите удалить?', 'Вопрос', MB_YESNO+MB_ICONQUESTION)<>IDДа, тогда //(1)
начинать
...
конец;
Application.MessageBox('Операция не удалась', 'Предупреждение', MB_OK); //(2)
AdoConnection1.CommitTrans;
кроме
Application.MessageBox('Операция не удалась', 'Предупреждение', MB_OK); //(3)
АдоСоединение1.РоллбакТранс;
конец;
=============================================== ============================================
Анализ: все проблемы в приведенном выше коде вызваны Application.MessageBox в (1), (2) и (3), но проблема не в самом Application.MessageBox, а в том, что он зависает в программе и требует от пользователя вмешательство, а затем продолжить выполнение последующих операций; если пользователь в это время покидает компьютер или не подтверждает работу этих диалоговых окон, вполне возможно, что вся система находится в состоянии ожидания, поскольку эта транзакция не завершилась. .
Чтобы избежать этой проблемы, есть два принципа:
(1) После начала транзакции программа может автоматически завершить транзакцию без вмешательства пользователя;
(2) Выполните самую короткую операцию в транзакции.
3. попробуйте...кроме...конечная структура
Ниже приведен пример, иллюстрирующий структуру try или пример использования транзакционных операций:
Код, о котором идет речь:
=============================================== ============================================
пытаться
...
AdoConnection1.BeginTrans;
...
AdoConnection1.CommitTrans;
кроме
АдоСоединение1.РоллбакТранс;
конец;
=============================================== ============================================
Анализ: если в коде возникает исключение после попытки AdoConnection1.BeginTrans, оно переходит к AdoConnection1.RollbackTrans для выполнения. Однако AdoConnection1 не запустил транзакцию из-за ошибки, поэтому во время выполнения AdoConnection1.RollbackTrans произошла ошибка.
Правильный код: ============================================ = ==============================================
AdoConnection1.BeginTrans;
пытаться
...
...
AdoConnection1.CommitTrans;
кроме
АдоСоединение1.РоллбакТранс;
конец;
=============================================== ============================================
Короче говоря, структура try используется для защиты от ненормальных операций. Если между try...Exception возникает исключение, то при разработке команды try необходимо обращать внимание на рациональность. архитектуры.
4. Нарушение собственной защиты транзакций
При создании прикладного программного обеспечения баз данных нам часто приходится сталкиваться со следующими проблемами: оценить исходные данные, а затем внести соответствующие изменения. Эта проблема кажется относительно простой, но если учесть, что в сети есть и другие люди, использующие ту же систему, то придется учитывать возможность случайных изменений. Мой коллега был неосторожен. Несмотря на мою подсказку, он рассмотрел проблему многопользовательской работы, но все равно написал проблемный код:
=============================================== ============================================
вар
adTemp: TAdoDataSet;
isOk: логическое значение;
начинать
adTemp := TAdoDataSet.Create(self);
пытаться
adsTemp.Connection := AdoConnection1;
adsTemp.CommandText := 'выберите fid, fnumber из tb1, где fid=120';
adTemp.Open;
isOk := adsTemp.FieldByName('fnumber').AsInteger>100;
окончательно
объявленияТемп.Бесплатно;
конец;
если нет, то ок
Выход;
AdoConnection1.BeginTrans;
пытаться
AdoConnection1.Execute('обновить tb1 set ffull=ffull + 1 из tb1, где fid=120';
...
...
AdoConnection1.CommitTrans;
кроме
АдоСоединение1.РоллбакТранс;
конец;
конец;
=============================================== ============================================
Анализ: я не знаю, видели ли вы проблему. Данные оцениваются до AdoConnection1.BeginTrans, а затем AdoConnection1.Execute используется для изменения данных. Если данные являются общими, то в течение периода после решения до. AdoConnection1.BeginTrans, tb1 Возможно, данные изменились, и эта защита транзакций бесполезна.
Правильный метод заключается в том, что решение и модификация должны быть одними и теми же данными. В следующих примерах показаны два метода (разница в том, что место запуска транзакции отличается):
Код 1 (после использования защиты транзакций оцениваются и изменяются те же данные):
=============================================== ============================================
вар
adTemp: TAdoDataSet;
isOk: логическое значение;
начинать
AdoConnection1.BeginTrans;
пытаться
adTemp := TAdoDataSet.Create(self);
пытаться
adsTemp.Connection := AdoConnection1;
adsTemp.CommandText := 'выберите fid, fnumber, ffull из tb1, где fid=120';
adTemp.Open;
если adTemp.FieldByName('fnumber').AsInteger>100, тогда
начинать
adTemp.Edit;
adsTemp.FieldByName('ffull').AsInteger :=adsTemp.FieldByName('ffull').AsInteger + 1;
объявленияТемп.Пост;
конец;
окончательно
объявленияТемп.Бесплатно;
конец;
AdoConnection1.CommitTrans;
кроме
АдоСоединение1.РоллбакТранс;
конец;
конец;
=============================================== ============================================
Код 2 (с использованием захвата исключений, если решение и модификация не являются одними и теми же данными, исключение произойдет во время adTemp.Post. Это функция объекта ADODataSet):
=============================================== ============================================
вар
adTemp: TAdoDataSet;
isOk: логическое значение;
начинать
adTemp := TAdoDataSet.Create(self);
пытаться
adsTemp.Connection := AdoConnection1;
adsTemp.CommandText := 'выберите fid, fnumber, ffull из tb1, где fid=120';
объявленияТемп.Открыть;
если adTemp.FieldByName('fnumber').AsInteger>100, тогда
начинать
AdoConnection1.BeginTrans;
пытаться
adTemp.Edit;
adsTemp.FieldByName('ffull').AsInteger :=adsTemp.FieldByName('ffull').AsInteger + 1;
объявленияТемп.Пост;
AdoConnection1.CommitTrans;
кроме
АдоСоединение1.РоллбакТранс;
конец;
конец;
окончательно
объявленияТемп.Бесплатно;
конец;
конец;