J'ai un souci avec un rollback imbriqué.
Je ne comprends pas pourquoi on n'arrive pas à rollbacker la dernière transaction
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
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 GOdonc tout va bien les 2 transactions s'imbriquent et committent toutes les 2.
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
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?
![]()
Partager