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

Откуда:
Сообщений: 20504
Господа, а в 2008 R2 вложенные транзакции нормально работают?
То есть внутренний COMMIT транзакцию не закрывает, только внешний?
В документации так написано, но хочется ещё раз уточнить.
11 ноя 14, 16:50    [16829642]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
defragmentator
Господа, а в 2008 R2 вложенные транзакции нормально работают?

покажите статью в которой ето писанно. Т.е. что вы подразумеваетет под такой транзакцией ?
Т5ест пишеться в 5 минут на коленке ,кстате,чтоб проверить
11 ноя 14, 17:12    [16829854]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
defragmentator
Господа, а в 2008 R2 вложенные транзакции нормально работают?

Нормально - это как в документации ?

defragmentator
То есть внутренний COMMIT транзакцию не закрывает, только внешний?
В документации так написано, но хочется ещё раз уточнить.

Т.е. если вам сказать, что не так, то вы даже проверять не будете ?
11 ноя 14, 17:14    [16829868]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Glory
defragmentator
Господа, а в 2008 R2 вложенные транзакции нормально работают?

Нормально - это как в документации ?

defragmentator
То есть внутренний COMMIT транзакцию не закрывает, только внешний?
В документации так написано, но хочется ещё раз уточнить.

Т.е. если вам сказать, что не так, то вы даже проверять не будете ?


Если сказать, что не так, тогда проверю :)
11 ноя 14, 17:51    [16830229]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
defragmentator
Если сказать, что не так, тогда проверю :)

Тогда - не так.
11 ноя 14, 17:55    [16830262]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
Владислав Колосов
Member

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

вложенные - это какие? Таких не бывает на сиквеле.
11 ноя 14, 18:25    [16830479]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Владислав Колосов
defragmentator,

вложенные - это какие? Таких не бывает на сиквеле.


Тут можно немного почитать
11 ноя 14, 18:38    [16830547]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4831
Я сегодня запускал такой скрипт

BEGIN TRAN


SELECT COUNT(...), SUM(..) FROM T 
WHERE .... 

EXEC dbo.Update_T -- изменяет Т


SELECT COUNT(...), SUM(..) FROM T 
WHERE .... 

ROLLBACK TRAN 


Внутри Update_T есть BEGIN TRAN ... COMMIT TRAN

Всё прекрасно откатывается
11 ноя 14, 18:41    [16830561]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
defragmentator
Member

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

ок, попробую.
Сейчас устал
11 ноя 14, 18:42    [16830569]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
Владислав Колосов
Member

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

если рассматриваете с этой точки зрения, то внутренний commit закрывает свою, внутреннюю транзакцию и уменьшает счетчик транзакций на 1.
11 ноя 14, 18:48    [16830604]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4831
defragmentator
a_voronin,

ок, попробую.
Сейчас устал


Собственно говоря, примитивный пример есть воз здесь. http://msdn.microsoft.com/en-us/library/ms187967.aspx
11 ноя 14, 18:49    [16830610]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
o-o
Guest
a_voronin
Всё прекрасно откатывается

о боже, a_voronin, вот в этом что я прекрасно откачу, вставку одной строки или обе?
сработает ли commit?
и да, что вернет @@TRANCOUNT под цифрой (1) и под цифрой (2)?

ответьте на запуская

create table dbo.t (id int);
go

begin tran
   insert into dbo.t (id) values (1); 
   
   begin tran
   
	   select @@TRANCOUNT; -- (1)
	   
	   insert into dbo.t (id) values (2); 
   rollback tran;
   
   select @@TRANCOUNT; -- (2)
   
commit tran;

select *
from dbo.t;   
11 ноя 14, 18:59    [16830679]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4831
o-o
a_voronin
Всё прекрасно откатывается

о боже, a_voronin, вот в этом что я прекрасно откачу, вставку одной строки или обе?
сработает ли commit?
и да, что вернет @@TRANCOUNT под цифрой (1) и под цифрой (2)?

ответьте на запуская

create table dbo.t (id int);
go

begin tran
   insert into dbo.t (id) values (1); 
   
   begin tran
   
	   select @@TRANCOUNT; -- (1)
	   
	   insert into dbo.t (id) values (2); 
   rollback tran;
   
   select @@TRANCOUNT; -- (2)
   
commit tran;

select *
from dbo.t;   


rollback откатит всё, а последний commit даст ошибку
11 ноя 14, 19:08    [16830722]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
o-o
Guest
ну т.е. откатывая вложенную транзакцию, мы откатили несколько больше?
посмотрим теперь, может, коммит вложенной транзакции что-то действительно коммитит?
begin tran
	insert into dbo.t(id) values (1);
	
	begin tran
		insert into dbo.t(id) values (2);
        commit;
rollback; 

select *
from dbo.t;
11 ноя 14, 22:18    [16831551]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
o-o
Guest
a_voronin,

вы, кстати, про @@TRANCOUNT не ответили, особенно про к-ый под цифрой (2) идет
вроде роллбэк всего 1 был, а куда-то 2 транзакции делись.
вы сперва объясните это как-нибудь, потом только уже отгадку смотрите в спойлере

+

что в первом случае, что во втором -- я сейчас про предыдущие 2 поста --
где делается безуспешная попытка только "внутреннюю транзакцию" закоммитить или откатить,
в лог вставится одно и то же:
select Operation, CONTEXT, [Transaction ID], [Transaction Name], [Xact ID]
from sys.fn_dblog(null, null);
---
Operation	CONTEXT	Transaction ID	Transaction Name	Xact ID
LOP_BEGIN_XACT	LCX_NULL	0000:0000c76a	user_transaction	93686
LOP_INSERT_ROWS	LCX_HEAP	0000:0000c76a	NULL	NULL
LOP_INSERT_ROWS	LCX_HEAP	0000:0000c76a	NULL	NULL
LOP_DELETE_ROWS	LCX_HEAP	0000:0000c76a	NULL	NULL
LOP_DELETE_ROWS	LCX_HEAP	0000:0000c76a	NULL	NULL
LOP_ABORT_XACT	LCX_NULL	0000:0000c76a	NULL	NULL


ну т.е. что в одном, что в другом случае всего 1 LOP_BEGIN_XACT и всего 1 LOP_ABORT_XACT
11 ноя 14, 22:51    [16831666]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
Диам
Member

Откуда:
Сообщений: 1490
Вложенный Commit закоммитит свою транзакцию.
А вот вложенный Rollback откатит ВСЕ начатые транзакции (свою и внешние). И если у вас Rollback будет вызван в хранимке, то по выходу из процедуры получите ошибку, что "число открытых транзакций было n, а стало 0". Ну и внешний Commit после этого тоже даст ошибку.
12 ноя 14, 09:06    [16832182]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Диам
Вложенный Commit закоммитит свою транзакцию

Нет
Marks the end of a successful implicit or explicit transaction. If @@TRANCOUNT is 1, COMMIT TRANSACTION makes all data modifications performed since the start of the transaction a permanent part of the database, frees the resources held by the transaction, and decrements @@TRANCOUNT to 0. If @@TRANCOUNT is greater than 1, COMMIT TRANSACTION decrements @@TRANCOUNT only by 1 and the transaction stays active.
12 ноя 14, 09:32    [16832283]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8570
Вложенные и именованные транзакции - это защита от говнокода, да смилуется надо мной модератор.
Ну еще и по имени можно найти транзакцию для восстановлении бэкапа при полной модели восстановления.
12 ноя 14, 11:32    [16833098]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Владислав Колосов
Вложенные и именованные транзакции - это защита от говнокода, да смилуется надо мной модератор.
Ну еще и по имени можно найти транзакцию для восстановлении бэкапа при полной модели восстановления.


Вложенные транзакции - это и есть г-код.
Проблемка в том, код приходится повторно использовать (из одной процедуры вызывать другую, уже написанную ранее)
12 ноя 14, 14:32    [16834559]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
o-o
Guest
defragmentator
Владислав Колосов
Вложенные и именованные транзакции - это защита от говнокода, да смилуется надо мной модератор.
Ну еще и по имени можно найти транзакцию для восстановлении бэкапа при полной модели восстановления.

Вложенные транзакции - это и есть г-код.
Проблемка в том, код приходится повторно использовать (из одной процедуры вызывать другую, уже написанную ранее)

навернее, корректнее сказать так: реализация вложенных транзакций в SQL Server-e "своеобразна" (полу-г-код),
но хотя бы все задокументировано и разъяснено, с чего они такое взяли:
Nesting Transactions

как раз для вашего и воронинского случая вроде бы:
хочется, чтобы всем заправляла внешняя транзакция, вызывайте свою внутреннюю (транзакционную) процедуру в транзакции;
если же надо, чтобы внутренняя (транзакционная) процедура была "автономной", не вызывайте ее в транзакции.

непонятно другое: с чего вдруг роллбэк "вложенной транзакции" должен откатить все снаружи себя?

ну и заодно отвечу тем, кому мало выложенного кода 16831551
Диам
Вложенный Commit закоммитит свою транзакцию.

цитатой из статьи по приведенной ссылке:
Committing inner transactions is ignored by the SQL Server Database Engine. The transaction is either committed or rolled back based on the action taken at the end of the outermost transaction. If the outer transaction is committed, the inner nested transactions are also committed. If the outer transaction is rolled back, then all inner transactions are also rolled back, regardless of whether or not the inner transactions were individually committed.
12 ноя 14, 15:08    [16834848]     Ответить | Цитировать Сообщить модератору
 Re: Вложенные транзакции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8570
Собственно, из-за этого приходится городить огород с проверкой счетчика транзакций при вхождении в процедуру.

Вложенные - не г-но код, а суровая действительность. Надо учитывать, что процедура внезапно может быть вызвана при открытой транзакции, а может быть и не вызвана, но транзакционность её выполнения обязательна независимо от намерений стороннего программиста. Обработчик ошибки должен учитывать - как выполнять откат.
12 ноя 14, 17:10    [16835982]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить