i
th
c
hàn
h
ô
n
H
q
u
n
t
r
C
S
DL
1
--
B
ư
c
1
Insert into
Ho
cS
inh
(
MaHS
,
HoT
en
,
Ma
Lop)
values
(‘
hs
01’,
’N
guyen
V A
,
1)
--
B
ư
c
2
Up
date
Lop
Se
t
SiSo
= SiSo +1
Hưng dn thc hành môn Hqun tr
CSDL
Chđ2:Transaction
1. S dng Transaction
1.1. Khái niệm transaction
Giao tác (transaction) 1 tập hp thtcác thao tác (statement) truy xut dliu trên CSDL
thành 1 đơn vcông vic logic (xem là 1 thao tác nguyên t), chuyn CSDL ttrng thái nht quán này
sang trng thái nht quán khác.
d: Ngân hàng thực hiện chuyển tin ttài khoản A sang tài khoản B, cần thc hiện hai công vic :
trtiền ca A, tăng tiền của B. Hai công việc này hoặc chai thành công hoc không công việc nào
thành công (nếu một công việc do nào đó không thc hin thành công thì trạng thái ban đầu trước
khi chuyển tiền phải được khôi phục đbảo toàn dliệu). Khi đó vic chuyển tiền cần được đặt vào một
giao tác.
Chú ý : khi ta viết một thao tác (statement) trong SQL Server, nếu không chthnào khác, thao tác
này là một transaction.
1.2. Tại sao phải dùng transaction
- Dùng khái niệm giao tác khi x c vấn đliên quan đến truy xuất dliệu đồng thời.
- nhng x trên CSDL đưc thc hiện bằng nhiu thao tác liên tiếp nhau, tập hp các thao tác này
phải được xem một thao tác nguyên tđđm bảo nh nht quán ca dliệu sau khi thc hin, nghĩa
là, hoặc tất cđưc thchin thành công, hoặc không có thao tác o được thc hintập hp c
thao tác này đưc viết thành một transaction.
d: Stored procedure thc hiện vic thêm mt học sinh vào lớp
Nếu bước 2 ca stored proc thc hiện không tnh công t dliệu trong CSDL còn nhất quán không?
1.3. Khai báo sử dụng transaction
Các lnh liên quan :
- Bắt đầu transaction :
obegin tran / begin transaction
- Hoàn tất transaction :
ocommit/ commit tran / commit transaction
- Quay lui transaction :
orollback / rollback tran / rollback transaction
-Đánh dấu savepoint trong transaction : save transaction tên_savepoint
-Biến@@trancount : cho biết stransaction hiện đang thc hiện (chưađược kết thúc vi rollback hay
commit) trong connection hin hành.
Ghi chú :
- lệnh rollback tran + tên_savepoint tác dng quay lui giao tác đến vtrí đặt savepoint tương ng
i
th
c
hàn
h
ô
n
H
q
u
n
t
r
C
S
DL
2
create proc sp_te
st
begin tran
--T2
as exec
s
p_tes
t
begin
tra
n
--T1 --do
s
ometh
ing
--do
s
ome
thing
comm
it
tran
commit
tr
an
(không c dng kết thúc transaction), các khóa (lock) đưcđặt khi thc hin các thao tác nằm
trong phn brollback sđưc mra. (xem ROLLBACKMỘT PHN TRANSACTION)
- Khi khai báo transaction tưng minh, phiđảm bảo rằng sau đónóđược rollback hoặc commit tưng
minh, nếu không, transaction stiếp tc tồn ti chiếm gitài nguyên, ngăn trsthc hin ca
các transaction khác.
-Lnh rollback ch tác dng quay lui các thao tác trên CSDL (thêm, xóa, sa). Các câu lnh
khác, chng hạn lnh gán, skhông b nh hưởng bởi lệnh rollback.
Các d: Cho bng dliệu bên dưi. Hãy cho biết giá trtại các ô màu vàng sau khi thc hiện (đc
lp) các transaction trong c dsau.
MaTS TuaSach Tacgia
1 Aaa ABC
2 Bbb DEF
3 Ccc GHI
Vd1 :
@@trancount = 0
Begin tran --(T1) @@Trancount = ?
update Tuasach set Tacgia = xxx where MaTS = 1
update TuaSach set TacGia = yyy where MaTS =2
update TuaSach set TacGia = zzz where MaTS =3
Commit tran --(T1) @@trancount =?
Vd 2:
declare @x int
set @x=3
@@trancount = 0
Begin tran --(T1) @@trancount =?
update Tuasach set Tacgia = xxx where MaTS = 1
update TuaSach set TacGia = yyy where MaTS =2
set @x =7
update TuaSach set TacGia = zzz where MaTS =3
Rollback --(tran) @@trancount =?
@x =?
1.4. Transaction lồng nhau
Các transaction ththc hin lồng nhau, mcđích chyếu là đcho phép các stored procedure
cha transaction thđược gi tnhững tiến trình đã nm bên trong một transaction hoặc tnhng
tiến trình không nằm bên trong mt transaction nào.
d:
proc sp_test được gọi tmột tiến trình nm n trong mt transaction (T2), do đó, transaction T1
trong sp_test được xem lng bên trong transaction T2.
i
th
c
hàn
h
ô
n
H
q
u
n
t
r
C
S
DL
3
Chú ý trước câu lệnh gi sp_test SQL Server tđng ghi nhgiá trbiến hthng
@@tranCount, gislưu vào biến @trc. Ngay sau câu lnh này, biến @trc
@@tranCount sđược so sánh giá tr, nếu khác nhau t SQL Server sphát sinh lỗi giúp biết được
lnh gi stored proc bo toàn các cp lng nhau vtransaction hay không. Đc biệt khi sp_test gọi
rollback thì chắc chắn T2 s lỗi toàn btransaction đãđưc rollback; lúc này người dùng được
thông báo đtquyết định thực hiện tiếp hoặc
kết thúc
tiến trình đang thc hiện.
- SQL đưa ra các qui đnh sau nhmđm bo vic thc hiện ca c transaction lồng nhau không m vi
phạm các nh cht ca giao tác :
Lệnh commit transaction sđược xem nhưthuc vtransaction btđầu sau nhất (bên trong nhất)
chưa commit , cho đưcđi kèm vi tên ca transaction bắt đầu trưc (cấp ngoài hơn).
Lệnh commit transaction ca transaction con chgiảm @@trancount đi 1,
không tác dng u cu hquản trghi nhn chc chn nhng thay đổi trên
CSDL transaction y đã làm.
-
Ch lnh commit transaction ca transaction ngoài cùng mới thc s tác dng này (nhưvy nếu
n transaction lồng nhau thì lnh commit transaction thn mới thc scommit toàn bgiao tác).
-
Chcn một lnh rollback tran (bất ccp nào) là toàn bgiao tác sbrollback. do quy lut
này đó là nhằm bảo đảm ý nghĩa một đơn vcông việc lôgic bi khi lnh gọi rollback tmt cấp transaction
nào đóđồng nghĩa vi việc không thc hiện thành công ti vtrí đó. Trong mt giao tác đang xét, nếu thc
hin không thành công bt kđim nào bt kcp giao c nào, giao tác ngoài cùng cần được khôi phc
biđã trong đã tồn tại mt trí “blỗi”.
-
Rollback tran + tran_name chhp lkhi “tran_name” tên ca transaction
đưc save tran trước đó.
-
Giao c không được lng nhau quá 32 cp.
-
Các transaction lng nhau không tranh chấp nhau vtài nguyên (có thchia svi nhau các kh trên
đơn vdliuđược đọc/ghi). Điu này thhiu tvic transaction lng nhau chxy ra trên cùng mt
connection. trên cùng mt connection nhưvy t dĩnhiên không tranh chp (bi các thao
tác sđược thc hiện tuần tự).
Ghi chú : Nếu hai transaction T1, T2 thc hiện trong cùng một connectionthì hai trưng hợp :
T2 thc hin sau khi T1 kết thúc, lúc đó T1 T2 đc lp nhau;
T2 thc hin khi T1 chưa kết thúc, khi đó T2 giao tác con lng bên trong T1.
Nói cách khác, không trường hp nào xảy ra tranh chấp gia hai transaction trên cùng connection.
1.5. Kiểm tra lỗi khi xây dựng transaction
Mt slỗi thưng gp sau khi thc hiện 1 câu lnh trong giao tác:
o Không quyền truy cp trên 1 đối tưng (table, stored procedure,…)
o Vi phm ràng buộc toàn vn (primary key, foreign key, check, rule, các ràng bucđược kim tra
bằng trigger,…).
o Deadlock.
o
SQL Server trgiá trli vtrong biến toàn cc@@error.
o @@error= 0: không xảy ra li
o @@error <> 0: xy ra lỗi vi li @@error
Giao tác không thtđộng rollback khi gặp nhng lỗi phát sinh trong
quá trình thực hin 1 câu lnh thành phần trong giao tác. vy cần kim
tra g trca biến @@error sau mi câu lnh thành phần trong giao tác cần xử nhng lỗi (nếu có)
yêu cu rollback giao tác mt cách tường minh bng lnh rollback/rollback transaction.
2. Rollback mt phn transaction
2.1. Đặt vấn đề
Thông thưng khi chúng ta rollback mt transaction thì toàn bnhng thao c đã thc hin trong
transaction đóđu bhy b. Tuy nhiên trong mt strưng hợp nhtđnh chúng ta nhu cu chhy
bmt sthao tác nào đó thôi (các thao tác n li không bhy b). Tuy nhu cu này ít khi phát