Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Засада с @@trancount / 13 сообщений из 13, страница 1 из 1
22.08.2018, 11:22
    #39691577
BredSpit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Засада с @@trancount
День добрый
Создал репро ситуации (в реалии все сложнее)
Код: 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
22.08.2018, 11:32
    #39691590
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Засада с @@trancount
BredSpit,

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

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

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

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

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


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

Извините, если я написал банальности, не разобравшись.
...
Рейтинг: 0 / 0
22.08.2018, 11:59
    #39691629
BredSpit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Засада с @@trancount
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
22.08.2018, 12:03
    #39691632
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Засада с @@trancount
BredSpit,

ну 0 и не должно быть, почему 2 это загадка поведения @@trancount
...
Рейтинг: 0 / 0
22.08.2018, 12:08
    #39691640
BredSpit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Засада с @@trancount
TaPaK, все SELECTы @@trancount из процедуры, кроме случая FOUR - показывают 0 (((( Вот что непонятно
...
Рейтинг: 0 / 0
22.08.2018, 12:11
    #39691642
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Засада с @@trancount
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
22.08.2018, 12:21
    #39691653
BredSpit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Засада с @@trancount
TaPaK, спасибо
...
Рейтинг: 0 / 0
22.08.2018, 12:27
    #39691660
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Засада с @@trancount
а если смотреть в transaction log то там вообще 3 открывается :)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Засада с @@trancount / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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