powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Засада с @@trancount
13 сообщений из 13, страница 1 из 1
Засада с @@trancount
    #39691577
BredSpit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый
Создал репро ситуации (в реалии все сложнее)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
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 то присутствует запись
Код: sql
1.
2.
3.
 select * from dbo.elog 
-----то присутствует запись 
Trancount end = 2


Не понятно откуда взялась это цифра Плюс селекты сразу до SIX и после SEVEN выдают 0
Подскажите пожалуйста - куда копать ?
Спасибо!
...
Рейтинг: 0 / 0
Засада с @@trancount
    #39691590
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BredSpit,

Любая модификация данных в не транзакции выполняется в неявной транзакции.
...
Рейтинг: 0 / 0
Засада с @@trancount
    #39691596
BredSpit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
msLex, спасибо
Я думал в этом направлении
Но :
1) почему все таки селекты в процедуре показывают всегда ноль И только селект из таблицы показывает другое значение
2) почему 'Trancount begin= ' из таблицы выдает 0
И вообще где @@trancount соответствует действительности
...
Рейтинг: 0 / 0
Засада с @@trancount
    #39691598
BredSpit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BredSpit1) почему все таки селекты в процедуре показывают всегда ноль

Я имел ввиду ноль в SIX и SEVEN и 1 в FOUR (что ожидаемо)
...
Рейтинг: 0 / 0
Засада с @@trancount
    #39691601
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BredSpitmsLex, спасибо
Я думал в этом направлении
Но :
2) почему 'Trancount begin= ' из таблицы выдает 0

так и перепешите одинаково будет 2 в обоих случаях.
...
Рейтинг: 0 / 0
Засада с @@trancount
    #39691611
BredSpit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKBredSpitmsLex, спасибо
Я думал в этом направлении
Но :
2) почему 'Trancount begin= ' из таблицы выдает 0

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

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


будет ненулевой результат
Но почему select'ы @@trancount из процедуры тогда выдают отличные значения ?
...
Рейтинг: 0 / 0
Засада с @@trancount
    #39691615
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каждый BEGIN TRANSACTION увеличивает @@TRANCOUNT на 1.
А COMMIT TRANSACTION уменьшает на 1.
При этом вложенных транзакций не бывает.
BEGIN TRANSACTION внутри транзакции просто увеличивает @@TRANCOUNT - и больше ничего.

Извините, если я написал банальности, не разобравшись.
...
Рейтинг: 0 / 0
Засада с @@trancount
    #39691629
BredSpit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap,
Сорри, то что Вы написали , я понимаю
У меня ситуация - есть INSERT в таблицу elog которая идет вне BEGIN TRAN COMMIT TRAN (несколько до BEGIN и одна после COMMIT)
select @@trancount из процедуры (до BEGIN и после COMMIT ) показывает 0 (TWO,THREE,SIX,SEVEN)
Но insert в eLog
Код: sql
1.
2.
insert into dbo.elog(dt ,descr)
select getdate(),'Trancount begin/end= '+convert(varchar,@@trancount)


показывает ненулевое значение
Вот этого я и не пойму
...
Рейтинг: 0 / 0
Засада с @@trancount
    #39691632
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BredSpit,

ну 0 и не должно быть, почему 2 это загадка поведения @@trancount
...
Рейтинг: 0 / 0
Засада с @@trancount
    #39691640
BredSpit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK, все SELECTы @@trancount из процедуры, кроме случая FOUR - показывают 0 (((( Вот что непонятно
...
Рейтинг: 0 / 0
Засада с @@trancount
    #39691642
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BredSpitTaPaK, все SELECTы @@trancount из процедуры, кроме случая FOUR - показывают 0 (((( Вот что непонятно
select dyenhb insert выполняется внутри транзакции. Почему 2, это единственный неясный вопрос :)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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
...
Рейтинг: 0 / 0
Засада с @@trancount
    #39691653
BredSpit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK, спасибо
...
Рейтинг: 0 / 0
Засада с @@trancount
    #39691660
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если смотреть в transaction log то там вообще 3 открывается :)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Засада с @@trancount
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]