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

Откуда:
Сообщений: 148
Допустим в транзакции у меня выполняется серия Update.
Произойдет ли откат изменений, если мне приспичит прекратить выполнение запроса?
22 окт 14, 00:03    [16740588]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
iluxa1810
Допустим в транзакции у меня выполняется серия Update.
Произойдет ли откат изменений, если мне приспичит прекратить выполнение запроса?
Да
22 окт 14, 00:24    [16740673]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8877
Произойти-то произойдёт.
Но вы должны понимать, что, например, порядок в identity-столбце сохранится, но появятся "дыры":

+
/****** Object:  Table [dbo].[Tb1]    Script Date: 22.10.2014 00:34:23 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
drop table tb1;
GO

CREATE TABLE [dbo].[Tb1](
	[Col1] [nchar](10) NULL,
	[Col2] [nchar](10) NULL,
	[Col3] [bigint] IDENTITY(1,1) NOT NULL
) ON [PRIMARY]

GO
insert tb1
values ('aaa','zzz'), ('bbb','yyy'), ('ccc','xxx'), ('ddd','www');

select * from tb1 order by col3;


Col1 Col2 Col3
aaa zzz 1
bbb yyy 2
ccc xxx 3
ddd www 4


... и получим промежность в identity-столбце в оконечном варианте:
+

begin tran; -- Начнёмс экспериментировать:
insert tb1
values ('aaa','zzz'), ('bbb','yyy'), ('ccc','xxx'), ('ddd','www');
insert tb1
values ('aaa','zzz'), ('bbb','yyy'), ('ccc','xxx'), ('ddd','www');
rollback tran; -- А вот тут нах сбросим (откатим) транзакцию со всеми (?) её причиндалами 

-- Так, глянем: а что же будет потом?: 
insert tb1
values ('aaa','zzz'), ('bbb','yyy'), ('ccc','xxx'), ('ddd','www');select * from tb1 order by col3;


Дыра-с (промеж 4 и 13):
Col1 Col2 Col3
aaa zzz 1
bbb yyy 2
ccc xxx 3
ddd www 4
aaa zzz 13
bbb yyy 14
ccc xxx 15
ddd www 16



Ну это, в общем, документирование поведение IDENTITY-поля. Но тоже к вопросу об "откате транзакции".
Есть ещё моменты, которые применяются при "глубоком логгировании" (когда необходимо, что бы информация о попытке изменения данных где-то оставалась даже не смотря на откат транзакции).

На форуме описывалось. Удачи, в общем...
22 окт 14, 01:11    [16740801]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
alexeyvg
iluxa1810
Допустим в транзакции у меня выполняется серия Update.
Произойдет ли откат изменений, если мне приспичит прекратить выполнение запроса?
Да
но только либо после закрытия сессии,
либо если установлен set xact_abort on,
либо если транзакция будет откачена явно.

А так и в этой сессии и даже в других с TIL READ UNCOMMITTED значения будут всё еще обновленными.
22 окт 14, 06:02    [16740936]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Ruuu
alexeyvg
пропущено...
Да
но только либо после закрытия сессии,
либо если установлен set xact_abort on,
либо если транзакция будет откачена явно.

А так и в этой сессии и даже в других с TIL READ UNCOMMITTED значения будут всё еще обновленными.
Под "приспичит прекратить выполнение запроса" я понимал "закрыть коннект к серверу".

Если имелось в виду "отвернуться от монитора" или "произошла ошибка", то да, тогда вы правы. Но, по моему, это не "прекратить".
22 окт 14, 09:31    [16741226]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
alexeyvg,

а я представил "приспичит прекратить выполнение запроса" как Cansel Exequting Query в ssms, коннект при этом останется.

я и не сомневался, что вы знаете, для ТС'а уточнил на всякий :)
22 окт 14, 09:58    [16741361]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Ruuu
а я представил "приспичит прекратить выполнение запроса" как Cansel Exequting Query в ssms, коннект при этом останется.
Да, что то я упустил про Cancel в SSMS, думал про разрыв коннекта в приложении :-)
Там транзакция остаётся висеть незакрытой...
22 окт 14, 10:04    [16741396]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить