Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 по транзакциям  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1117
Доброе утро.

хочу убрать недопонимание в этом вопросе.
Вот как я понимаю что такое транзакция :
транзакциями называется группа действий, переводящая базу данных из одного целостного состояния в другое и выполняющаяся по принципу "либо все, либо ничего".

Ну понятно.

И у меня как раз стоит задача надо проапдейтить кучу табличек. При этом в исходе
должны проапдейтиться либо все таблички и вывестись сообщение - "всё хорошо",
либо при конфликте хотя бы одного апдейта откатываем то, что удалось проапдейтить и высветить - "всё плохо".

делаю вот так :

declare @newname varchar (255)
declare @oldname varchar (255)

set @oldname='ИП Афанасьев'
set @newname='ИП Луч'

BEGIN TRANSACTION
update BOOK_PURCH set CONTRACTOR = @newname where CONTRACTOR = @oldname
update BOOK_SALES set CONTRACTOR = @newname where CONTRACTOR = @oldname
update BOOK_SALES set CONTRACTOR = @newname where CONTRACTOR = @oldname
update BOOK_SALES set CONTRACTOR = @newname where CONTRACTOR = @oldname
IF @@ERROR = 0
begin
COMMIT
SELECT 'всё хорошо'
end
ELSE
begin
ROLLBACK 
SELECT 'всё плохо'
end


но вот незадача (IF @@ERROR = 0) он же сработает только для последнего , а мне то надо чтобы он отработал для каждого. и в случае плохого исхода откатил бы. Как тут быть ?
19 ноя 12, 09:14    [13492893]     Ответить | Цитировать Сообщить модератору
 Re: по транзакциям  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1117
ой пардон . в крипте ошибка 2 другие таблицы имеют другое имя :
declare @newname varchar (255)
declare @oldname varchar (255)

set @oldname='ИП Афанасьев'
set @newname='ИП Луч'

BEGIN TRANSACTION
update BOOK_PURCH set CONTRACTOR = @newname where CONTRACTOR = @oldname
update BOOK_SALES1 set CONTRACTOR = @newname where CONTRACTOR = @oldname
update BOOK_SALES2 set CONTRACTOR = @newname where CONTRACTOR = @oldname
update BOOK_SALES3 set CONTRACTOR = @newname where CONTRACTOR = @oldname
IF @@ERROR = 0
begin
COMMIT
SELECT 'всё хорошо'
end
ELSE
begin
ROLLBACK 
SELECT 'всё плохо'
end
19 ноя 12, 09:33    [13492932]     Ответить | Цитировать Сообщить модератору
 Re: по транзакциям  [new]
_djХомяГ
Guest
Можно посмотреть в сторону
1 set xact abort
2 try catch
3 проверка @@error после каждого DML оператора
19 ноя 12, 09:40    [13492947]     Ответить | Цитировать Сообщить модератору
 Re: по транзакциям  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1117
кажется разобрался :
declare @newname varchar (255)
declare @oldname varchar (255)
           @err numeric(10)
set @err=0

set @oldname='ИП Афанасьев'
set @newname='ИП Луч'
BEGIN TRANSACTION
update BOOK_PURCH set CONTRACTOR = @newname where CONTRACTOR = @oldname
set @err = @err + @@ERROR 
update BOOK_SALES1 set CONTRACTOR = @newname where CONTRACTOR = @oldname
set @err = @err + @@ERROR 
update BOOK_SALES2 set CONTRACTOR = @newname where CONTRACTOR = @oldname
set @err = @err + @@ERROR 
update BOOK_SALES3 set CONTRACTOR = @newname where CONTRACTOR = @oldname
IF @@ERROR = 0
begin
COMMIT
SELECT 'всё хорошо'
end
ELSE
begin
ROLLBACK 
SELECT 'всё плохо'
end
19 ноя 12, 09:40    [13492948]     Ответить | Цитировать Сообщить модератору
 Re: по транзакциям  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1117
_djХомяГ
Можно посмотреть в сторону
3 проверка @@error после каждого DML оператора


ага, до этого допёр, спасибо :)
19 ноя 12, 09:42    [13492957]     Ответить | Цитировать Сообщить модератору
 Re: по транзакциям  [new]
_djХомяг
Guest
если прверять на @@error то не так

update 1
if @@error<>0 goto FAILURE

update 1
if @@error<>0 goto FAILURE

FAILURE:

ну и правильней осуществлять обработку с учетом вложенности транзацкий @@trancount и тд и тп
19 ноя 12, 09:43    [13492960]     Ответить | Цитировать Сообщить модератору
 Re: по транзакциям  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1117
_djХомяг
если прверять на @@error то не так

update 1
if @@error<>0 goto FAILURE

update 1
if @@error<>0 goto FAILURE

FAILURE:

ну и правильней осуществлять обработку с учетом вложенности транзацкий @@trancount и тд и тп


declare @newname varchar (255)
declare @oldname varchar (255)
           @err numeric(10)
set @err=0

set @oldname='ИП Афанасьев'
set @newname='ИП Луч'
BEGIN TRANSACTION
update BOOK_PURCH set CONTRACTOR = @newname where CONTRACTOR = @oldname
if @@error<>0 goto FAILURE
update BOOK_SALES1 set CONTRACTOR = @newname where CONTRACTOR = @oldname
if @@error<>0 goto FAILURE
update BOOK_SALES2 set CONTRACTOR = @newname where CONTRACTOR = @oldname
if @@error<>0 goto FAILURE
update BOOK_SALES3 set CONTRACTOR = @newname where CONTRACTOR = @oldname
if @@error<>0 goto FAILURE
good:
if @@error=0
begin
COMMIT
SELECT 'всё хорошо'
end
FAILURE:
if @@error<>0
begin
ROLLBACK 
SELECT 'всё плохо'
end



не понял про
_djХомяг
ну и правильней осуществлять обработку с учетом вложенности транзацкий @@trancount и тд и тп


у нас что не одна транзакция ? я понимая что этот блок из апдейтов как единое целое , как транзакция и есть, значит что-то не допонимаю прокоментируйте, пожалуйста.
19 ноя 12, 09:57    [13493009]     Ответить | Цитировать Сообщить модератору
 Re: по транзакциям  [new]
_djХомяГ
Guest
В данном конкретном случае один блок (@@trancount=1) и код отработает
Но если одна процедура вызывает другую, то необходимо проверять "вложенность"
19 ноя 12, 10:00    [13493023]     Ответить | Цитировать Сообщить модератору
 Re: по транзакциям  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Я как-то думал, что при возникновении ошибки транзакция откатывается автоматически, без всяких ROLLBACK.
Может, я наивный?
19 ноя 12, 11:04    [13493243]     Ответить | Цитировать Сообщить модератору
 Re: по транзакциям  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
defragmentator
Я как-то думал, что при возникновении ошибки транзакция откатывается автоматически, без всяких ROLLBACK.
Может, я наивный?
Наивный...
SET XACT_ABORT
19 ноя 12, 11:08    [13493280]     Ответить | Цитировать Сообщить модератору
 Re: по транзакциям  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
andron81,

Так ты его только для последнего update и проверяеш.
Проверяй для всех, либо исключения задействуй.
19 ноя 12, 11:10    [13493290]     Ответить | Цитировать Сообщить модератору
 Re: по транзакциям  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1117
MasterZiv
andron81,

Так ты его только для последнего update и проверяеш.
Проверяй для всех, либо исключения задействуй.


да ну ... а дальше первого сообщения ты не читаешЬ ?
19 ноя 12, 11:14    [13493320]     Ответить | Цитировать Сообщить модератору
 Re: по транзакциям  [new]
Гость333
Member

Откуда:
Сообщений: 3683
andron81,

Это пример для реальной базы данных? Если да, то скорее всего она плохо спроектирована, т.к. не соответствует третьей нормальной форме. В указанных таблицах желательно хранить идентификатор контрагента, а не его наименование. Тогда наименование достаточно будет обновить только в таблице контрагентов.
Наличие таблиц BOOK_SALES1, BOOK_SALES2, BOOK_SALES3 тоже может указывать на проблемы в проектировании БД.
19 ноя 12, 12:53    [13493996]     Ответить | Цитировать Сообщить модератору
 Re: по транзакциям  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1117
Гость333
andron81,

Это пример для реальной базы данных? Если да, то скорее всего она плохо спроектирована, т.к. не соответствует третьей нормальной форме. В указанных таблицах желательно хранить идентификатор контрагента, а не его наименование. Тогда наименование достаточно будет обновить только в таблице контрагентов.
Наличие таблиц BOOK_SALES1, BOOK_SALES2, BOOK_SALES3 тоже может указывать на проблемы в проектировании БД.



За замечание спасибо , конечно, но в курсе.
б.д. я не проектировал.

таблицы SALES1, BOOK_SALES2, BOOK_SALES3 из головы, не охото было переписывать их полные названия.
Есть основная табличка в ней "CONTRACTOR" (там поле называется IDNAME) является первичным ключем , а в других таблицах это поле внешний ключ. сделано плохо, но переделывать разработчикам уже поздно.
19 ноя 12, 13:06    [13494112]     Ответить | Цитировать Сообщить модератору
 Re: по транзакциям  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
andron81
За замечание спасибо , конечно, но в курсе.
б.д. я не проектировал.

таблицы SALES1, BOOK_SALES2, BOOK_SALES3 из головы, не охото было переписывать их полные названия.
Есть основная табличка в ней "CONTRACTOR" (там поле называется IDNAME) является первичным ключем , а в других таблицах это поле внешний ключ. сделано плохо, но переделывать разработчикам уже поздно.


Изменять первичные ключи - вообще сомнительная практика, но если уж изменяете - не проще поставить ON UPDATE CASCADE,
чем писать кучу запросов на обновление связанных таблиц?
19 ноя 12, 13:44    [13494349]     Ответить | Цитировать Сообщить модератору
 Re: по транзакциям  [new]
andron81
Member

Откуда: Смоленск
Сообщений: 1117
Кот Матроскин
ON UPDATE CASCADE,



не знаю такую
19 ноя 12, 13:50    [13494382]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить