- 1 -
SQL Server 2000 : Giao tác (Transaction) – Ph n 1
hai lo i giao tác đ c s d ng trong Transaction-SQL : ượ
t ng minh không t ng minh. M c đ nh các l nh bênườ ườ
trong m t (patch) ch a các câu l nh s lo i giao tác
không t ng minh.ườ
1/- Khái ni m v giao tác :
Giao tác trong các lo i c s d li u quan h l n đ c s d ng trong nh ng tr ng ơ ượ ườ
h p các hành đ ng c p nh t d li u trên nhi u b ng khác nhau đ c th c hi n ượ
trong cùng m t đ n v (unit). Nói m t cách khác thì các hành đ ng c p nh t d li u ơ
trong m t đ n v s đ c ghi nh n l i khi t t c các hành đ ng con bên trong đó th c ơ ượ
hi n thành công, ng c l i n u có ít nh t m t hành đ ng nào đó th c hi n th t b i thì ượ ế
t t c các hành đ ng bên trong đ n v s b h y b đ đ m b o tính toàn v n c a d ơ
li u trong các b ng.
Ví d :
B n hình dung m t khách hàng có cùng lúc 2 lo i tài kho n trong ngân hàng. M t là tài
kho n thanh toán dùng đ th c hi n các giao d ch thu chi qua l i c a khách hàng v i
các công ty khác. Hai tài kho n ti t ki m nhân c a khách hàng cho phép khách ế
hàng g i ti n ti t ki m đ l y ti n lãi cu i kỳ theo kỳ h n 3 tháng. ế
Gi s sau th i gian 3 tháng, khách hàng đ n ngân hàng đ nh n s ti n lãi t tài ế
kho n ti t ki m cá nhân. Tuy nhiên v khách hàng này mu n b ph n giao d ch tài ế
kho n th c hi n t đ ng chuy n s ti n lãi t tài kho n ti t ki m sang tài kho n ế
thanh toán c a mình.
Nh n xét th y r ng trong h th ng ch ng trình t i ngân hàng ph i th c hi n hai hành ươ
đ ng c p nh t d li u : m t l y ra s ti n lãi trong tài kho n ti t ki m, hai n p ế
s ti n lãi vào tài kho n thanh toán. Chuy n x y ra n u m t trong hai hành đ ng ế
th c hi n không thành công mà hành đ ng còn l i v n đ c ghi l i nh n vào c s d ượ ơ
li u ? B n cùng xem xét nh sau : ư
Tr ng h p 1 :ườ n u hành đ ng rút s ti n lãi trong tài kho n ti t ki m th c hi nế ế
thành công hành đ ng n p s ti n lãi đó vào tài kh an thanh toán th c hi n b th t
b i thì xem nh khách hàng đã m t đi s ti n lãi c a tài kho n ti t ki m (khách hàng ư ế
m t ti n).
• Tr ng h p 2 :ườ n u hành đ ng rút s ti n lãi trong tài kh an ti t ki m th c hi nế ế
th t b i và hành đ ng n p s ti n lãi đó vào tài kho n thanh toán th c hi n thành công
thì xem nh khách hàng có thêm s ti n lãi c hai tài kho n (ngân hàng m t ti n).ư
- 2 -
Nh n xét th y r ng c hai tr ng h p nêu trên đ u làm cho h th ng vi ph m tính ườ
toàn v n d li u nh h ng đ n uy tín ch t l ng c a nn hàng. Nh ng n u ưở ế ượ ư ế
nh vào khái ni m c a giao tác, b n th quy đ nh c hai hành đ ng trên s đ c ượ
bao bên trong m t đ n v giao tác nh m nói r ng chúng s đ c ghi nh n l i khi c ơ ượ
hai hành đ ng con bên trong đó th c hi n thành công, ng c l i n u tr ng h p 1 ượ ế ườ
ho c tr ng h p 2 mô t ph n trên có x y ra thì t t c các hành đ ng bên trong giao ườ
tác s b h y b (không ghi l i các thay đ i d li u). Đi u này s làm cho h th ng
không vi ph m tính toàn v n d li u.
2/- Giao tác không t ng minh :ườ
Có hai lo i giao tác đ c s d ng trong Transaction-SQL : t ng minh và không t ng ượ ườ ườ
minh. M c đ nh các l nh bên trong m t lô (patch) ch a các câu l nh s có lo i giao tác
là không t ng minh, đi u này có nghĩa là n u có ít nh t m t câu l nh th c hi n khôngườ ế
thành công bên trong thì t t c các l nh còn l i s không đ c ghi nh n l i. B n ượ
không nên s d ng lo i giao tác này.
Ví d :
B n cho th c hi n cùng lúc 3 l nh đ c p nh t d li u vào 3 b ng khác nhau trong
cùng m t lô. Tuy nhiên câu l nh cu i cùng khi th c hi n s b th t b i do vi ph m
tính toàn v n d li u khóa ngo i (vì đ n đ t hàng đã đ c nh n hàng r i nên không ơ ượ
th xóa đ c) nên các l nh tr c đó trong cùng m t lô s không đ c ghi nh n l i. ượ ướ ượ
Đ ki m ch ng l i các l nh thêm v t t m i, s a đ i tên nhà cung c p đ c ghi ư ượ
nh n l i hay không ? B n th c hi n các l nh SELECT FROM đ xem l i d li u các
b ng VATTU và NHACC.
- 3 -
Nh n xét th y r ng trong d trên, các l nh thêm v t t m i, s a đ i tên nhà cung ư
c p hoàn toàn không đ c ghi nh n l i trong lô khi câu l nh cu i cùng th c hi n b l i ượ
(vì v t t m i không đ c thêm vào b ng VATTU). ư ượ
SQL Server 2000 : Giao tác (Transaction) – Ph n 2
Thông th ng giao tác t ng minh đ c s d ng trong cácườ ườ ượ
tr ng h p c p nh t d li u trên nhi u b ng khác nhau ườ
ph i đ m b o cácnh đ ng này n m trong cùng m t đ n v ơ
x lý.
3/- Giao tác t ng minh :ườ
Đ b t đ u m t giao tác t ng minh, b n ph i s d ng câu ườ BEGIN TRAN trong dòng
l nh đ u tiên c a m t đ n v x lý. Đ ch đ nh cho Microsoft SQL Server k t thúc ơ ế
giao tác ghi nh n l i các hành đ ng c p nh t d li u thì b n ph i s d ng l nh
COMMIT TRAN ng c l i khi s d ng l nh ượ ROLLBACK TRAN dùng đ ch
đ nh cho Microsoft SQL Server k t thúc giao tác mà không ghi nh n l i các hành đ ng ế
c p nh t d li u trong giao tác.
3.2/- L nh ch đ nh b t đ u m t giao tác :
Nh ph n trên đã trình bày l nh ư BEGIN TRAN ng đ s d ng trong các giao tác
t ng minh. M i giao tácth đ c ghép l ng các giao tác con bên trong đó, b nườ ượ
th ch đ nh tên cho t ng giao tác l ng nhau nh m th c hi n d dàng vi c k t thúc c a ế
m i giao tác. Bi n h th ng ế @@TRANCOUNT tr v c p đ l ng hi n hành bên
trong các giao tác. pháp l nh ch đ nh b t đ u m t giao tác đ c t nh bên ượ ư
d i.ướ
Cú pháp :
Trong đó :
Tên giao tác : tên c a giao tác đ c ch đ nh rõ ràng, ch nên s d ng tên giao tác khi ượ
c p đ l ng nhau c a các giao tác nhi u h n hai c p. ơ
Ví d :
S d ng l nh BEGIN TRAN đ ch đ nh b t đ u th c hi n giao tác : thêm v t t m i ư
vào b ng VATTU, tuy nhiên khi k t thúc giao tác b n không l u l i v t t này. ế ư ư
- 4 -
K t qu tr v :ế
Nh n xét th y r ng trong ví d này, tr c khi th c hi n giao tác, chúng ta có 11 v t t , ướ ư
sau đó trong giao tác thêm vào m t v t t m i. Tuy nhiên cu i cùng khi k t thúc giao ư ế
tác chúng ta không ghi l i hành đ ng thêm v t t b ng l nh ư ROLLBACK TRAN, do
đó t ng s v t t v n là 11 v t t khi k t thúc giao tác. ư ư ế
3.2/- Các l nh ch đ nh k t thúc m t giao tác : ế
Theo d trên chúng ta th hi u ý nghĩa c a l nh ROLLBACK TRAN dùng đ
ch đ nh k t thúc giao tác nh ng không ghi nh n l i các hành đ ng c p nh t d li u ế ư
bên trong giao tác.
Ngoài ra chúng ta c th s d ng l nh COMMIT TRAN dùng đ ch đ nh k t thúc ế
giao tác nh ng đ ng ý ghi nh n l i các hành đ ng c p nh t d li u bên trong giao tác.ư
Cú pháp c a c hai l nh này đ c mô t nh bên d i. ượ ư ướ
Cú pháp :
- 5 -
Ho c
Trong đó :
Tên giao tác : tên c a giao tác đ c đ nh nghĩa tr c đó trong câu l nh ượ ướ BEGIN
TRAN.
Ví d :
T o m t b ng t m dùng đ minh h a vi c s d ng các giao tác l ng nhau. K t thúc ế
giao tác ngoài cùng b ng l nh ROLLBACK TRAN không ghi nh n l i các hành
đ ng c p nh t d li u c a các giao tác con tr c đó. Đi u này có nghĩa là d li u c a ướ
b ng t m #TestTran là hoàn toàn tr ng.
Nh n xét th y r ng trong d này tên c a các giao tác đ c s d ng trong các l nh ượ
ROLLBACK TRAN ho c COMMIT TRAN ch đ giúp cho chúng ta d đ c d