Страница 1 из 1

вопрос о транзакциях

Добавлено: 07 сен 2007, 03:26
SeventhSon
помогите начинающему.почти дочитал книгу Borry.главу о транзакцияx точно.но так и не понял следующее:
создаю таблицу:
CREATE TABLE TBL1 (FL1 INTEGER NOT NULL);
ALTER TABLE TBL1 ADD PRIMARY KEY (FL1);
и пишу в таблицу 1.
затем запускаю скрипт:
connect '127.0.0.1:c:\db\test.fdb' user 'sysdba' password '1'^
set transaction;
insert into tbl1(fl1)values(1);
insert into tbl1(fl1)values(2);
commit;
выдаёт ошибку.это и понятно-1 там уже есть.но почему же тогда 2 записывается если это одна транзакция,которая завершилась ошибкой?ведь должно записать либо всё либо ничего.
что и где я не дочитал?

Добавлено: 07 сен 2007, 07:54
Dimitry Sibiryakov
Ну ты же сам написал - commit. А это значит - все.

Добавлено: 07 сен 2007, 10:09
kdv
плохо главу про транзакции читал. commit это подтверждение сохранения изменений. А не выполнение операторов между start/commit.
серверу пофигу, чего ты делаешь в транзакции, и успешно оно выполняется или нет. Раз сказал commit, то все что выполнилось успешно - сохранится в БД.

Добавлено: 08 сен 2007, 09:13
SeventhSon
я не нашёл там аналогичного моему примера.и у Скляра во Введении в Interbase как-то вскользь упоминается set transaction и всё.
как же тогда корректно и 100%-надёжно сделать в одной транзакции к примеру списание суммы с одного счёта и начисление на другой?
insert into credit
if select from credit=OK then insert into debit??
(на синтаксис не обращайте внимание, я об алгоритме)
это уже какой-то бэйсик получается
какое решение?проверять после изменений код ошибки(gdscode sqlcode) и только если всё нормально делать commit, иначе rollback?

Добавлено: 08 сен 2007, 14:44
Merlin
SeventhSon писал(а): какое решение?проверять после изменений код ошибки(gdscode sqlcode) и только если всё нормально делать commit, иначе rollback?
Типа того.

Добавлено: 10 сен 2007, 01:31
kdv
и у Скляра во Введении в Interbase
блин, выкинь ты скляра. Это перевод документации по IB 5, одной книги - ProgGuide, которая сейчас называется embedded sql guide, и даже вредна в определенном смысле.
только если всё нормально делать commit, иначе rollback?
еще раз повторяю - только клиент, т.е. твое приложение, решает, как завершать транзакцию в зависимости от успешности или неуспешности выполненных операторов.