Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 транзакции  [new]
7 7 7
Guest
Помогите, плиз
Есть конструкция вида:
insert into table1 ...
update table2 ...

Задача: insert и update всегда должны срабатывать вместе, если одна из команд не срабатывает, вторая также не должна выполнится. Простое заключение этих команд в
begin tran
...
commit tran
не помогает (иногда).
Как описать транзакцию, чтобы гарантировать выполнение (или не выполнение) обеих команд.
25 апр 13, 17:39    [14231652]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Например,
set xact_abort on
25 апр 13, 17:41    [14231660]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
7 7 7
Guest
Гость333,

Т.е. достаточно:
SET XACT_ABORT ON
begin tran
insert into table1 ...
update table2 ...
commit tran
Чтобы гарантировать выполнение (или не выполнение) обеих команд?
25 апр 13, 17:56    [14231725]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Гость333
Member

Откуда:
Сообщений: 3683
7 7 7
Гость333,

Т.е. достаточно:
SET XACT_ABORT ON
begin tran
insert into table1 ...
update table2 ...
commit tran
Чтобы гарантировать выполнение (или не выполнение) обеих команд?

Хм... а что вы имеете в виду под "если одна из команд не срабатывает"? Это значит — выдаёт ошибку?
25 апр 13, 18:01    [14231736]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
7 7 7
Guest
Гость333
7 7 7
Гость333,

Т.е. достаточно:
SET XACT_ABORT ON
begin tran
insert into table1 ...
update table2 ...
commit tran
Чтобы гарантировать выполнение (или не выполнение) обеих команд?

Хм... а что вы имеете в виду под "если одна из команд не срабатывает"? Это значит — выдаёт ошибку?


Нет. Команды запускаются в задании. В журнале задания ошибок нет. Но, судя по кол-ву записей insert не всегда срабатывает, а update всегда.
25 апр 13, 18:07    [14231751]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
А какие у вас условия выполнения инсерта и апдейта?

И если вам надо чтобы апдейт был только после успешного (по каким-то критериям инсерта) то транзакции тут не при чем.
25 апр 13, 18:18    [14231794]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Вообще был ли некий инсерт можно проверить так
IF OBJECT_ID('tempdb..#TempTable') > 0  DROP TABLE #TempTable
SELECT [Field] = ' ' INTO #TempTable  WHERE 1 = 2 

IF @@RowCount > 0 BEGIN 
  SELECT 'Успешный инсерт'
END 
ELSE BEGIN
  SELECT 'Грусть@Печаль'
END
25 апр 13, 18:24    [14231808]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
7 7 7
Guest
Cammomile
А какие у вас условия выполнения инсерта и апдейта?

И если вам надо чтобы апдейт был только после успешного (по каким-то критериям инсерта) то транзакции тут не при чем.


insert into table1 ... select ... from table2 where field1=0
update table2 set field1=1 where field1=0

Да, мне надо, чтобы апдейт был только (и обязательно) после успешного инсерта. При этом, на время выполнения этих команд, надо залочить table2 от вставок.
Помогите, плиз.
25 апр 13, 18:24    [14231810]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
http://msdn.microsoft.com/ru-ru/library/ms187373.aspx
25 апр 13, 18:38    [14231836]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
А если будут проблемы с пониманием МСДН (как у меня =) ), то вот разжеванно с картинками
25 апр 13, 18:46    [14231861]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
http://stackoverflow.com/questions/7843733/confused-about-updlock-holdlock
25 апр 13, 18:46    [14231864]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
7 7 7
Guest
Cammomile
http://stackoverflow.com/questions/7843733/confused-about-updlock-holdlock


Т.е. надо?:

insert into table1 with (tablock) ... select ... from table2 with (tablockx) where field1=0
update table2 with (tablock) set field1=1 where field1=0

А как гарантировать, чтобы между инсертом и апдейтом не вклинилась какая либо модификация с table2?
25 апр 13, 18:54    [14231888]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Нужно использовать @@Rowcount для проверки наличия успешного в вашей сессии инсерта
IF для ветвления
BEGIN TRAN ROLLBACK COMMIT для отката и закрепления результата
И нужный вам табличный хинт, чтобы другие сессии не могли лезть в те таблицы, кот. вы хотите защитить от изменений =)
25 апр 13, 18:59    [14231898]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
7 7 7
insert into table1 with (tablock) ... select ... from table2 with (tablockx) where field1=0
update table2 with (tablock) set field1=1 where field1=0
update table2 
 set field1=1
output
 inserted.field2, inserted.field3, ... inserted.fieldN into table1 (field2, field3, ... fieldN)
where field1=0
25 апр 13, 19:10    [14231926]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
7 7 7
Guest
invm
7 7 7
insert into table1 with (tablock) ... select ... from table2 with (tablockx) where field1=0
update table2 with (tablock) set field1=1 where field1=0
update table2 
 set field1=1
output
 inserted.field2, inserted.field3, ... inserted.fieldN into table1 (field2, field3, ... fieldN)
where field1=0


Спс.
А для блокировок надо добавить?:
update table2 with (UPDLOCK, HOLDLOCK)
set field1=1
output
inserted.field2, inserted.field3, ... inserted.fieldN into table1 with (UPDLOCK, HOLDLOCK) (field2, field3, ... fieldN)
where field1=0
25 апр 13, 19:28    [14231976]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
7 7 7
А для блокировок надо добавить?:
update table2 with (UPDLOCK, HOLDLOCK)
Это само добавится, без явного написания.
25 апр 13, 19:31    [14231988]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
7 7 7,
Не надо добавлять никаких хинтов. Тем более, что в предложении output этого сделать нельзя.
25 апр 13, 19:35    [14231995]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Гость333
set xact_abort on
1089677

Не киллер фича которую стоит сразу советовать. И вообще нафиг её.
25 апр 13, 20:59    [14232142]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
HOLDLOCK
Guest
alexeyvg
7 7 7
А для блокировок надо добавить?:
update table2 with (UPDLOCK, HOLDLOCK)
Это само добавится, без явного написания.

HOLDLOCK не добавиться, т.к. HOLDLOCK это TIL serializable
другое дело что он здесь нахер не нужен.
26 апр 13, 11:10    [14234039]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Mnior
Гость333
set xact_abort on
1089677

Не киллер фича которую стоит сразу советовать. И вообще нафиг её.

Согласен, нафиг, сам-то я всё заворачиваю в try-catch ;-)
26 апр 13, 11:22    [14234109]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
7 7 7
Guest
Попробовал:
update table2
set field1=1
output
inserted.field2, inserted.field3, ... inserted.fieldN into table1 (field2, field3, ... fieldN)
where field1=0

ругается: The target table 'table' of the OUTPUT INTO clause cannot have any enabled triggers.

какие еще у меня варианты есть?
26 апр 13, 14:12    [14235183]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
7 7 7
Guest
Попробовал:
update table2
set field1=1
output
inserted.field2, inserted.field3, ... inserted.fieldN into table1 (field2, field3, ... fieldN)
where field1=0

ругается: The target table 'table1' of the OUTPUT INTO clause cannot have any enabled triggers.

какие еще у меня варианты есть?
26 апр 13, 14:13    [14235187]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
7 7 7,

вы бы версию сервера озвучили б штоле.
26 апр 13, 14:34    [14235310]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
7 7 7
какие еще у меня варианты есть?
select top (0)
 field2, field3, ... fieldN
into
 #t
from
 table1;
 
update table2 
 set field1=1
output
 inserted.field2, inserted.field3, ... inserted.fieldN into #t (field2, field3, ... fieldN)
where field1=0;

insert into table1
 (field2, field3, ... fieldN)
select
  field2, field3, ... fieldN
from
 #t;
26 апр 13, 14:37    [14235322]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
7 7 7
Guest
tpg
7 7 7,

вы бы версию сервера озвучили б штоле.


2008 r2
26 апр 13, 14:39    [14235333]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить