powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с транзакциями
13 сообщений из 13, страница 1 из 1
Проблема с транзакциями
    #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
Проблема с транзакциями
    #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
Проблема с транзакциями
    #32033503
Vitaly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если я вместо ALTER TABLE DROP COLUMN
поставлю DROP TABLE не существующей таблицы
то транзакция не откатится!!!

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

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

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

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

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

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

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

Может есть какое-нибудь другое решение???
...
Рейтинг: 0 / 0
Проблема с транзакциями
    #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
Проблема с транзакциями
    #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
Проблема с транзакциями
    #32033640
Vitaly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Люди - помогите!

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

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

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

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

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

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

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

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

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

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

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


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