Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонимание технологии транзакции, Вернее как работает метод Commit() 
:(
    Опции темы
ArnoldLane
Дата 25.7.2005, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 14.6.2005

Репутация: нет
Всего: нет



Суть вопроса слегка отвлеченная, но честно говоря очень интригующая, по крайней мере для меня.
Есть две таблицы:
Код

CREATE TABLE "ORDERS" 
(
  "NAME"    VARCHAR(100) CHARACTER SET WIN1251,
  "VENDOR"    VARCHAR(50) CHARACTER SET WIN1251,
  "PRICE"    NUMERIC(5, 2),
  "AMOUNT"    NUMERIC(5, 2),
  "CODE"    VARCHAR(10) CHARACTER SET WIN1251 NOT NULL,
  "INSTORE"    NUMERIC(1, 0),
  "CODE_GROUPS"    INTEGER,
  "NUMBER_ORDER"    INTEGER,
  "DATE_ORDER"    DATE
);

CREATE TABLE "ORDER_TMP" 
(
  "NAME"    VARCHAR(100) CHARACTER SET WIN1251,
  "VENDOR"    VARCHAR(50) CHARACTER SET WIN1251,
  "PRICE"    NUMERIC(5, 2),
  "AMOUNT"    NUMERIC(5, 2),
  "CODE"    VARCHAR(10) CHARACTER SET WIN1251 NOT NULL,
  "INSTORE"    NUMERIC(1, 0),
  "CODE_GROUPS"    INTEGER
);

В Runtime в таблицу ORDER_TMP вставляeтся выборка из третьей таблицы:
<1>
Код

INSERT INTO ORDER_TMP SELECT * FROM DIRECTORY WHERE Q_ORDER > 0

, затем выполняется:
<2>
Код

ALTER TABLE ORDER_TMP ADD NUMBER_ORDER INTEGER,ADD DATE_ORDER DATE

Далее заполняем вновь созданные поля необходимыми значениями.
<3>
Код

UPDATE ORDER_TMP SET NUMBER_ORDER = '1', DATE_ORDER = '25.07.2005'

Не трудно заметить, что на данном этапе две таблицы ORDERS и ORDER_TMP абсолютно идентичны по структуре. Что позволяет нам надеятся на выполнение следуюшего предложения:
<4>
Код

INSERT INTO ORDERS SELECT * FROM ORDER_TMP

Теперь о транзакциях, предложения <1>,<2> и <3> выполнялись в рамках одной транзакции, а <4> в рамках уже другой.
Теперь прикрасно видно, что я ошибся, предложением <2> я изменил структуру таблицы, но не сделал подтверждения и сразу пытаюсь заполнить только что созданные поля значениями.

Так вот теперь самое интересное. Первая транзакция выполняется, по-крайней мере Exception не возникает. А вот при выполнении второй транзакции точнее предложения <4>, возникает Exception с текстом - "conversion error from string '25.07.2005'". ПОЧЕМУ?


PM MAIL   Вверх
kdv
Дата 10.9.2005, 19:38 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











ты налетел на грабли. DDL выполнять надо в отдельной транзакции, каждый оператор завершая commit-ом.
Самый худший случай - именнт то что ты сделал, то есть alter table add, а потом update, в одной транзакции.
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0441 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.