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

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
SeventhSon
Сообщения: 25
Зарегистрирован: 11 авг 2007, 17:40

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

Сообщение SeventhSon » 07 сен 2007, 03:26

помогите начинающему.почти дочитал книгу 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 записывается если это одна транзакция,которая завершилась ошибкой?ведь должно записать либо всё либо ничего.
что и где я не дочитал?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 07 сен 2007, 07:54

Ну ты же сам написал - commit. А это значит - все.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 07 сен 2007, 10:09

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

SeventhSon
Сообщения: 25
Зарегистрирован: 11 авг 2007, 17:40

Сообщение SeventhSon » 08 сен 2007, 09:13

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

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 08 сен 2007, 14:44

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 10 сен 2007, 01:31

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

Ответить