J'ai un souci avec un rollback imbriqué.

Je ne comprends pas pourquoi on n'arrive pas à rollbacker la dernière transaction
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'TRANTEST'))
	DROP PROCEDURE TRANTEST
GO
 
CREATE PROCEDURE TRANTEST
AS
DECLARE
	@tran_name VARCHAR(30)
 
SELECT @tran_name = 'TTest'
 
BEGIN TRY
	print @@trancount
	print 'BEGIN TRAN '+ @tran_name
		BEGIN TRAN @tran_name 
	print @@trancount
 
--select 1/0
 
		PRINT 'PROCEDURE OK'
 
	print @@trancount
	print 'COMMIT TRAN '+ @tran_name
		COMMIT TRAN @tran_name
	print @@trancount
END TRY 
BEGIN CATCH
	print @@trancount
	print 'ROLLBACK TRAN '+ @tran_name
 
		ROLLBACK TRAN @tran_name
	print @@trancount
END CATCH
GO
print '-- test 1'
print @@trancount
EXECUTE TRANTEST 
print @@trancount
GO
 
 
print '-- test 2'
print @@trancount
print 'begin tran toto'
begin tran toto
	print @@trancount
	EXECUTE TRANTEST 
	print @@trancount
 
print 'commit tran toto'
commit tran toto
print @@trancount
GO
et voilà ce que j'obtiens
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- test 1
0
0
BEGIN TRAN TTest
1
PROCEDURE OK
1
COMMIT TRAN TTest
0
0
-- test 2
0
begin tran toto
1
1
BEGIN TRAN TTest
2
PROCEDURE OK
2
COMMIT TRAN TTest
1
1
commit tran toto
0
donc tout va bien les 2 transactions s'imbriquent et committent toutes les 2.
Si je décommente la ligne --select 1/0, voilà ce que j'obtiens:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
-- test 1
0
0
BEGIN TRAN TTest
1
 
(0 row(s) affected)
1
ROLLBACK TRAN TTest
0
0
-- test 2
0
begin tran toto
1
1
BEGIN TRAN TTest
2
 
(0 row(s) affected)
2
ROLLBACK TRAN TTest
Msg 6401, Level 16, State 1, Procedure TRANTEST, Line 28
Cannot roll back TTest. No transaction or savepoint of that name was found.
2
Msg 266, Level 16, State 2, Procedure TRANTEST, Line 0
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 2.
2
commit tran toto
1

Ça veut dire que lorsque la procédure est exécutée seule elle arrive à rollbacker et si la même procédure est imbriquée dans une autre transaction elle ne peut pas être rollbackée.
Mais comment ca se fait?