Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с транзакциями / 13 сообщений из 13, страница 1 из 1
21.06.2002, 17:48:12
    #32033495
Vitaly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями
Проблема:

Есть вот такая простенька табличка:
create table t2 (id int, Ware int)

Если я пишу:
begin transaction
select @@Trancount
go
ALTER TABLE t2
DROP COLUMN Ware
go
select @@Trancount
go
rollback transaction

То все нормально и rollback transaction откатывает транзакцию. А переменная @@Trancount всегда равна единице.

А вот если я попытаюсь удалить из таблицы не существующий столбец - что-то типа:

begin transaction
select @@Trancount
go
ALTER TABLE t2
DROP COLUMN WareNotExists -- такого столбца нет
go
select @@Trancount
go
rollback transaction

То тут начинаются неприятные чудеса: Первый селект
переменной TranCount дает 1. А после неудачного удаления
столбца переменная TranCount УСТАНАВЛИВАЕТСЯ В 0 !!!!!
И rollback говорит что нет активной транзакции....

ПОЧЕМУ????? МОЖНО ЭТОГО КАК-ТО ИЗБЕЖАТЬ????
Нужно чтобы транзакция не откатывалась при неудачном выполнении оператора DROP COLUMN (ведь при успешно выполнении drop column не откатывает транзакцию)

Помогите!!!!

P.S.
Я использую 7-ую версию
...
Рейтинг: 0 / 0
21.06.2002, 18:11:27
    #32033500
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями
У меня SQL Server 2000, но тем не менее:

Books Online->Accessing and Changing Relational Data->Transactions->Controlling Transactions


Errors During Transaction Processing

If a severe error prevents the successful completion of a transaction,
SQL Server automatically rolls back the transaction and frees all resources
held by the transaction.


Ошибка отсутствия поля, надо полагать, из разряда severe и SET XACT_ABORT тут не поможет.

Удачи
...
Рейтинг: 0 / 0
21.06.2002, 18:15:27
    #32033503
Vitaly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями
Если я вместо ALTER TABLE DROP COLUMN
поставлю DROP TABLE не существующей таблицы
то транзакция не откатится!!!

Как же так?
...
Рейтинг: 0 / 0
21.06.2002, 18:25:49
    #32033507
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями
А что тут удивительного?
Кстати, сродни этому т.н. Deferred Name Resolution,
когда для существующего объекта проверяются все
ссылки на составляющие (поля для таблицы), а для
не существующего - нет.

Удачи
...
Рейтинг: 0 / 0
21.06.2002, 19:00:34
    #32033511
Vitaly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями
Проблема эта возникла вот когда:

Мне необходимо обновить структуру БД
с помощью скрипта
(в том числе там есть и ALTER TABLE )

Если не возникает error то должен выполнится ВЕСЬ скрипт

Если же возникнет, то не один оператор из скрипта не должен сработать

Сейчас я это сделал с помощью пары операторов:
begin transaction
commit transaction

Это все прекрасно работает, если не возникает ошибка при
alter table...

Может есть какое-нибудь другое решение???
...
Рейтинг: 0 / 0
22.06.2002, 14:56:53
    #32033537
Victor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями
Может так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
        begin tran
       ..........
                --супер пупер код
 
       ...........
        COMMIT TRAN  
    if @@ERROR <>  0  
         goto FAILURE
    end

        COMMIT TRAN 
        return ( 0 )
FAILURE:
        if @@TRANCOUNT >  0 
        begin
            ROLLBACK TRANSACTION mytrans
            COMMIT TRANSACTION
        end
        return ( 1 )

...
Рейтинг: 0 / 0
24.06.2002, 11:03:28
    #32033589
Vitaly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями
Проблема в том что если на месте "супер пупер кода 1" будет стоять удаление не существующего столбца таблицы, то произойдет такая ошибка:

Server: Msg 4924, Level 16, State 1, Line 13
ALTER TABLE DROP COLUMN failed because column 'Col1' does not exist in table 't1'.

а после - ОТКАТ ТРАНЗАКЦИИ.
И код "--супер пупер код 2" будет исполняться ВНЕ РАМОК ТРАНЗАКЦИИ!!!!!!. Вот в чем основная проблема

И соответсвенно оператор commit transaction также
вызовет еррор (хотя это уже большого значения иметь не будет).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
       begin tran
       ..........
                --супер пупер код 1
 
                --супер пупер код 2
 
       ...........
        COMMIT TRAN  
...
Рейтинг: 0 / 0
24.06.2002, 15:23:12
    #32033640
Vitaly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями
Люди - помогите!

Решение, пока, так и не нашлось!!!
...
Рейтинг: 0 / 0
24.06.2002, 15:56:53
    #32033647
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями
Что вам мешает проверить наличие столбца с определенным именем в таблицы перед выполнением ALTER ?

Код: plaintext
1.
2.
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Mytable' AND COLUMN_NAME = 'MyColumn')
...
...
Рейтинг: 0 / 0
24.06.2002, 16:12:24
    #32033652
Vitaly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями
Абсолютно ничего не мешает.

Но дело не в столбце. Я написал это, только в качестве примера.

Где гарантия, что не возникнет какая-нибудь другая ошибка с severity >= 16. Такая ошибка приведет к откату транзакции.

Я, конечно, могу проверить на существование столбец.
Ну а потом?
Нужно будет проверять на существование внешние ключи, первичные ключи, default constraint-ы, check-ов и т.д. и т.п.... , учавствует ли таблица в репликации.....
...
Рейтинг: 0 / 0
24.06.2002, 16:19:01
    #32033656
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями
EM например решает такие задачи подобным образом

- создается новая таблица
- данные копируются из старой таблицы
- старая таблица удаляется
- новая таблица переименовывается

Просто, тупо, ресурсоемко, но железно работает и оставляет систему работоспособной.

Примерный скрипт можно получить в самом EM при интерактивном редактировании сттруктуры таблицы (какя-то кнопка на панели, что-то вроде Save changes as script)
...
Рейтинг: 0 / 0
24.06.2002, 16:25:33
    #32033659
Vitaly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями
Это, конечно, в какой-то степени выход.

Ну а как быть если ошибка возникнет при копировании данных из одной таблицы в другую (transcation log переполнился) или в какой-нибудь другой момент?

Опять возникнет еррор и откат транзакции.... :-)
...
Рейтинг: 0 / 0
24.06.2002, 16:35:37
    #32033663
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с транзакциями
Ну ошибка типа переполнения лога могут возникнуть при выполнении любой команды любого скрипта.

Несомненный плюс такого метода тот, что оригинальныая таблица остается неизменной при выполнении скрипта, поэтому получаем что либо скрипт выполняется полностью, либо таблица не меняется.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с транзакциями / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]