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

Откуда:
Сообщений: 20
День добрый
Создал репро ситуации (в реалии все сложнее)
create table dbo.elog (id  int identity,dt datetime,descr varchar(100))
go
create procedure [dbo].[proc]
as
declare @err varchar(255),
        @rc  int,
        @tc  int,
        @eFlag bit = 0


--необходимые SETы
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NOCOUNT ON
------LOGGIN
insert into dbo.elog(dt ,descr)
select getdate(),'Proc statrting'


select @tc =  @@trancount

select @@trancount as TWO
------LOGGIN
insert into dbo.elog(dt ,descr)
select getdate(),'Trancount begin= '+convert(varchar,@tc)
select @@trancount as THREE



BEGIN TRY
            if @tc = 0
            begin tran;
            select @@trancount as FOUR
            

         if @tc = 0 commit tran;
         select @tc,@@trancount as FIVE
            
END TRY
BEGIN CATCH
        select @err = error_message() 
        if @tc = 0 and @@trancount > 0
        rollback tran;
        select @eFlag = 1
END  CATCH

------------в случае ошибки пишем сей факт в некий лог -----------
if @eFlag = 1
begin 
 insert into dbo.elog(dt ,descr)
  select getdate(),'error here'
       
end 

------итоговый селект
select @@trancount as SIX

------LOGGIN
insert into dbo.elog(dt ,descr)
select getdate(),'Trancount end= '+convert(varchar,@@trancount)
where @@trancount<>0
------итоговый селект
select @@trancount as SEVEN
--select  @err,@@trancount,* from #rs
--select * from #loads
--необходимые SETы
FIN:
SET QUOTED_IDENTIFIER OFF
SET ARITHABORT OFF
SET NOCOUNT OFF
go

Вообщем когда идут selectы @@trancount из процедуры - все ожидаемо Во всех селектах , кроме FOUR (в этом случае он 1) значение @@trancount 0
Но ....при если посмотреть select * from dbo.elog то присутствует запись
 select * from dbo.elog 
-----то присутствует запись 
Trancount end = 2

Не понятно откуда взялась это цифра Плюс селекты сразу до SIX и после SEVEN выдают 0
Подскажите пожалуйста - куда копать ?
Спасибо!
22 авг 18, 11:22    [21650453]     Ответить | Цитировать Сообщить модератору
 Re: Засада с @@trancount  [new]
msLex
Member

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

Любая модификация данных в не транзакции выполняется в неявной транзакции.
22 авг 18, 11:32    [21650473]     Ответить | Цитировать Сообщить модератору
 Re: Засада с @@trancount  [new]
BredSpit
Member

Откуда:
Сообщений: 20
msLex, спасибо
Я думал в этом направлении
Но :
1) почему все таки селекты в процедуре показывают всегда ноль И только селект из таблицы показывает другое значение
2) почему 'Trancount begin= ' из таблицы выдает 0
И вообще где @@trancount соответствует действительности
22 авг 18, 11:36    [21650479]     Ответить | Цитировать Сообщить модератору
 Re: Засада с @@trancount  [new]
BredSpit
Member

Откуда:
Сообщений: 20
BredSpit
1) почему все таки селекты в процедуре показывают всегда ноль

Я имел ввиду ноль в SIX и SEVEN и 1 в FOUR (что ожидаемо)
22 авг 18, 11:38    [21650482]     Ответить | Цитировать Сообщить модератору
 Re: Засада с @@trancount  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
BredSpit
msLex, спасибо
Я думал в этом направлении
Но :
2) почему 'Trancount begin= ' из таблицы выдает 0

так и перепешите одинаково будет 2 в обоих случаях.
22 авг 18, 11:42    [21650486]     Ответить | Цитировать Сообщить модератору
 Re: Засада с @@trancount  [new]
BredSpit
Member

Откуда:
Сообщений: 20
TaPaK
BredSpit
msLex, спасибо
Я думал в этом направлении
Но :
2) почему 'Trancount begin= ' из таблицы выдает 0

так и перепешите одинаково будет 2 в обоих случаях.


Ok - согласен с этим Если переписать напрямую через
'Trancount begin= '+convert(varchar,@@trancount) вместо select convert(varchar,@tc)

будет ненулевой результат
Но почему select'ы @@trancount из процедуры тогда выдают отличные значения ?
22 авг 18, 11:49    [21650497]     Ответить | Цитировать Сообщить модератору
 Re: Засада с @@trancount  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Каждый BEGIN TRANSACTION увеличивает @@TRANCOUNT на 1.
А COMMIT TRANSACTION уменьшает на 1.
При этом вложенных транзакций не бывает.
BEGIN TRANSACTION внутри транзакции просто увеличивает @@TRANCOUNT - и больше ничего.

Извините, если я написал банальности, не разобравшись.
22 авг 18, 11:50    [21650502]     Ответить | Цитировать Сообщить модератору
 Re: Засада с @@trancount  [new]
BredSpit
Member

Откуда:
Сообщений: 20
iap,
Сорри, то что Вы написали , я понимаю
У меня ситуация - есть INSERT в таблицу elog которая идет вне BEGIN TRAN COMMIT TRAN (несколько до BEGIN и одна после COMMIT)
select @@trancount из процедуры (до BEGIN и после COMMIT ) показывает 0 (TWO,THREE,SIX,SEVEN)
Но insert в eLog
insert into dbo.elog(dt ,descr)
select getdate(),'Trancount begin/end= '+convert(varchar,@@trancount)

показывает ненулевое значение
Вот этого я и не пойму
22 авг 18, 11:59    [21650522]     Ответить | Цитировать Сообщить модератору
 Re: Засада с @@trancount  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
BredSpit,

ну 0 и не должно быть, почему 2 это загадка поведения @@trancount
22 авг 18, 12:03    [21650528]     Ответить | Цитировать Сообщить модератору
 Re: Засада с @@trancount  [new]
BredSpit
Member

Откуда:
Сообщений: 20
TaPaK, все SELECTы @@trancount из процедуры, кроме случая FOUR - показывают 0 (((( Вот что непонятно
22 авг 18, 12:08    [21650538]     Ответить | Цитировать Сообщить модератору
 Re: Засада с @@trancount  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
BredSpit
TaPaK, все SELECTы @@trancount из процедуры, кроме случая FOUR - показывают 0 (((( Вот что непонятно

select dyenhb insert выполняется внутри транзакции. Почему 2, это единственный неясный вопрос :)

CREATE TABLE #temp (col1 int, transaction_id int, tran_name varchar(max));
INSERT INTO #temp 
SELECt  
	@@TRANCOUNT, 
	t.transaction_id, 
	a.name 
from 
	sys.dm_tran_session_transactions t
INNER JOIN  
	sys.dm_tran_active_transactions a 
ON
	t.transaction_id = a.transaction_id
WHERE 
	t.session_id = @@SPID

SELECT * FROM #temp

DROP TABLE #temp
22 авг 18, 12:11    [21650546]     Ответить | Цитировать Сообщить модератору
 Re: Засада с @@trancount  [new]
BredSpit
Member

Откуда:
Сообщений: 20
TaPaK, спасибо
22 авг 18, 12:21    [21650558]     Ответить | Цитировать Сообщить модератору
 Re: Засада с @@trancount  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
а если смотреть в transaction log то там вообще 3 открывается :)
22 авг 18, 12:27    [21650568]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить