|
|
|
Проблема с транзакциями
|
|||
|---|---|---|---|
|
#18+
Проблема: Есть вот такая простенька табличка: 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-ую версию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2002, 17:48:12 |
|
||
|
Проблема с транзакциями
|
|||
|---|---|---|---|
|
#18+
У меня 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 тут не поможет. Удачи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2002, 18:11:27 |
|
||
|
Проблема с транзакциями
|
|||
|---|---|---|---|
|
#18+
Если я вместо ALTER TABLE DROP COLUMN поставлю DROP TABLE не существующей таблицы то транзакция не откатится!!! Как же так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2002, 18:15:27 |
|
||
|
Проблема с транзакциями
|
|||
|---|---|---|---|
|
#18+
А что тут удивительного? Кстати, сродни этому т.н. Deferred Name Resolution, когда для существующего объекта проверяются все ссылки на составляющие (поля для таблицы), а для не существующего - нет. Удачи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2002, 18:25:49 |
|
||
|
Проблема с транзакциями
|
|||
|---|---|---|---|
|
#18+
Проблема эта возникла вот когда: Мне необходимо обновить структуру БД с помощью скрипта (в том числе там есть и ALTER TABLE ) Если не возникает error то должен выполнится ВЕСЬ скрипт Если же возникнет, то не один оператор из скрипта не должен сработать Сейчас я это сделал с помощью пары операторов: begin transaction commit transaction Это все прекрасно работает, если не возникает ошибка при alter table... Может есть какое-нибудь другое решение??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2002, 19:00:34 |
|
||
|
Проблема с транзакциями
|
|||
|---|---|---|---|
|
#18+
Может так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2002, 14:56:53 |
|
||
|
Проблема с транзакциями
|
|||
|---|---|---|---|
|
#18+
Проблема в том что если на месте "супер пупер кода 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2002, 11:03:28 |
|
||
|
Проблема с транзакциями
|
|||
|---|---|---|---|
|
#18+
Люди - помогите! Решение, пока, так и не нашлось!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2002, 15:23:12 |
|
||
|
Проблема с транзакциями
|
|||
|---|---|---|---|
|
#18+
Что вам мешает проверить наличие столбца с определенным именем в таблицы перед выполнением ALTER ? Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2002, 15:56:53 |
|
||
|
Проблема с транзакциями
|
|||
|---|---|---|---|
|
#18+
Абсолютно ничего не мешает. Но дело не в столбце. Я написал это, только в качестве примера. Где гарантия, что не возникнет какая-нибудь другая ошибка с severity >= 16. Такая ошибка приведет к откату транзакции. Я, конечно, могу проверить на существование столбец. Ну а потом? Нужно будет проверять на существование внешние ключи, первичные ключи, default constraint-ы, check-ов и т.д. и т.п.... , учавствует ли таблица в репликации..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2002, 16:12:24 |
|
||
|
Проблема с транзакциями
|
|||
|---|---|---|---|
|
#18+
EM например решает такие задачи подобным образом - создается новая таблица - данные копируются из старой таблицы - старая таблица удаляется - новая таблица переименовывается Просто, тупо, ресурсоемко, но железно работает и оставляет систему работоспособной. Примерный скрипт можно получить в самом EM при интерактивном редактировании сттруктуры таблицы (какя-то кнопка на панели, что-то вроде Save changes as script) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2002, 16:19:01 |
|
||
|
Проблема с транзакциями
|
|||
|---|---|---|---|
|
#18+
Это, конечно, в какой-то степени выход. Ну а как быть если ошибка возникнет при копировании данных из одной таблицы в другую (transcation log переполнился) или в какой-нибудь другой момент? Опять возникнет еррор и откат транзакции.... :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2002, 16:25:33 |
|
||
|
Проблема с транзакциями
|
|||
|---|---|---|---|
|
#18+
Ну ошибка типа переполнения лога могут возникнуть при выполнении любой команды любого скрипта. Несомненный плюс такого метода тот, что оригинальныая таблица остается неизменной при выполнении скрипта, поэтому получаем что либо скрипт выполняется полностью, либо таблица не меняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2002, 16:35:37 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3462&tid=1822210]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
24ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 293ms |

| 0 / 0 |
