
- 1 -
SQL Server 2000 : Giao tác (Transaction) – Ph n 1ầ
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.ườ
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 mà 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 là tài kho n ti t ki m cá 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à l y ra s ti n lãi trong tài kho n ti t ki m, hai là n pộ ậ ậ ữ ệ ộ ấ ố ề ả ế ệ ạ
s ti n lãi vào tài kho n thanh toán. Chuy n gì 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 và 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 và có nh h ng đ n uy tín ch t l ng c a ngân hàng. Nh ng n uẹ ữ ệ ả ưở ế ấ ượ ủ ư ế
nh vào khái ni m c a giao tác, b n có 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 lô 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ó đ 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 ví 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 vàườ ợ ậ ậ ữ ệ ề ả
ph i đ m b o các hành đ 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 và 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 và 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 dùng đ s d ng trong các giao tácể ử ụ
t ng minh. M i giao tác có th đ c ghép l ng các giao tác con bên trong đó, b n cóườ ỗ ể ượ ồ ạ
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. Cú pháp l nh ch đ nh b t đ u m t giao tác đ c mô 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 ví d trên chúng ta có 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 và 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 ví 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 và dỉ ể ễ ọ ễ

