GVHD: ThS Đỗ Thị Minh Phụng
Transaction – Giao tác (SQL
Server)
Liên hệ với so sánh với Oracle
1. Khái niệm
2. Phân loại
3. Giao tác không tường minh (Implicit Transaction)
4. Giao tác tường minh (Explicit Transaction)
1. Khái niệm
Giao tác (transaction) là 1 tập hợp có thứ tự các thao tác (statement) truy
xuất dữ liệu trên CSDL thành 1 đơn vị công việc logic (xem là 1 thao tác
nguyên tố), chuyển CSDL từ trạng thái nhất quán này sang trạng thái nhất
quán khác
Bài toán chuyển tiền từ tài
khoản A -> tài khoản B
Trừ tiền bên A
Cộng tiền bên B
- Chỉ một trong 2 hành động thành công ?
- Trạng thái trước đó của CSDL có được đảm bảo ?
Cần cài đặt giao tác cho việc
chuyển tiền
2.Phân loại
Autocommit transactions
Mỗi một thao tác đơn (statement) được xem là 1 transaction
Explicit transactions
Transaction bắt đầu với câu lệnh BEGIN TRANSACTION và thực thi qua câu
lệnh COMMIT or ROLLBACK.
Implicit transactions
Các transaction được thực hiện liên tiếp nhau – được coi là một chuỗi. Mỗi
transaction trong chuỗi đó cũng được thực thi qua câu lệnh COMMIT or
ROLLBACK
Batch-scoped transactions
Chạy thông qua session MARS (Multi active result sets). Lúc này nếu trong
một chuỗi các transaction của một file batch nếu có transaction chưa được
thực thì thì transaction này sẽ được SQL Server tự động kết thúc
SQL Server thực thi transaction theo 4 chế độ.
AUTOCOMMIT
EXPLICIT
IMPLICIT
BATCH-
SCOPED
SET IMPLICIT_TRANSACTION
(ON/ OFF)
BEGIN TRANSACTION
MARS Session
3. Giao tác không tường minh
Sau khi chế độ implicit transaction
(SET IMPLICIT_TRANSACTION
ON) được bật , một trong những câu
lệnh sau sẽ bắt đầu chuỗi giao tác
không tường minh .
Sau khi câu lệnh kết thúc (commit
hoặc rollback) thì SQL Server sẽ tự
động thực hiện tiếp các transaction
sau đó cho đến khi kết thúc chuỗi
hoặc gặp chế độ implicit được tắt
(SET IMPLICIT_TRANSACTION
OFF)
4. Giao tác tường minh
- Để bắt đầu một giao tác tường minh, sử dụng câu BEGIN TRAN.
- Để chỉ định 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 -> sử dụng lệnh COMMIT TRAN
- Để chỉ định 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, sử dụng lệnh ROLLBACK TRAN
BEGIN TRAN[SACTION] [Tên_giao_tác]
ROLLBACK TRAN[SACTION] [Tên_giao_tác]
COMMIT TRAN[SACTION] [Tên_giao_tác]
Tên_giao_tác : phải đượ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
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
4.1/ Cú pháp
4.2/ Transaction lồng nhau
SQL cho phép các giao tác này được thực thi bên trong một thao tác khác. Lúc
này biến hệ thống tự động là @@TRANCOUNT trả về cấp độ lồng hiện hàng bên
trong giao tác cha (tổng số giao tác được lồng )
SQL đưa ra các qui định sau nhằm đảm bảo việc thực hiện của các transaction
lồng nhau không làm vi phạm các tính chất của giao tác :
•
Lệnh COMMIT TRANSACTION sẽ được xem như thuộc về transaction bắt đầu sau
nhất (bên trong nhất) chưa commit , cho dù nó được đi kèm với tên của transaction
bắt đầu trước (cấp ngoài hơn).
•
Lệnh COMMIT của transaction con chỉ giảm @@TRANCOUNT đi 1, không có tác
dụng yêu cầu hệ quản trị ghi nhận chắc chắn những thay đổi trên CSDL mà
transaction này đã làm.
•
Chỉ có COMMIT của transaction ngoài cùng mới thực sự có tác dụng này (như vậy
nếu có n transaction lồng nhau thì lệnh commit transaction thứ n mới thực sự commit
toàn bộ giao tác).
•
Ngược với COMMIT , chỉ cần có một lệnh ROLLBACK (ở bất cứ cấp nào) là toàn
bộ giao tác sẽ bị rollback.
•
ROLLBACK TRAN + Tên_giao_tác chỉ hợp lệ khi Tên_giao_tác là tên của
transaction ngoài cùng, nếu là tên của transaction bên trong, lệnh này sẽ bị lỗi.
4.3 / Phân vùng trong giao tác – SAVE TRAN
- Ta có thể chỉ định việc đồng ý ghi nhận hoặc không ghi nhận lại các hành
động cập nhật dữ liệu riêng lẻ bên trong một giao tác bằng cách phân chia
thành nhiều vùng nhỏ cho các câu lệnh bên trong một giao tác.
- Bằng cách này chúng ta chia nhỏ các hành động bên trong giao tác ra thành
nhiều phần, tương ứng từng phần nhỏ chúng ta có thể dễ dàng chủ động đồng ý
ghi nhận hoặc không ghi nhận lại việc cập nhật dữ liệu.
SAVE TRAN[SACTION] [Tên_vùng]
Các _lệnh_bên_trong
• Tên vùng : dùng để chỉ định vùng chứa các lệnh cập nhật dữ liệu
và tên vùng nên duy nhất trong một giao tác.
• Các_lệnh : các lệnh được phân chia theo vùng bên trong giao tác.
4.4/ Kiểm tra và xử lý lỗi trong giao tác
Một số lỗi thường gặp sau khi thực hiện 1 câu lệnh trong giao tác:
- Không có quyền truy cập trên 1 đối tượng (table, stored procedure,…)
- Vi phạm ràng buộc toàn vẹn (primary key, foreign key, check, rule, các ràng
buộc được kiểm tra bằng trigger,…).
- Deadlock.
…
Trong SQL Server có biến hệ thống @@ERROR – cho biết kết quả thực thi
của câu lệnh gần nhất là thành công hay thất bại
+ @@ERROR = 0: không xảy ra lỗi
+ @@ERROR <> 0: xảy ra lỗi với mã lỗi là @@ERROR
Giao tác không thể tự động ROLLBACK khi gặp những lỗi phát sinh trong
quá trình thực hiện 1 câu lệnh thành phần trong giao tác. Vì vậy cần kiểm tra giá
trị của biến @@ERROR sau mỗi câu lệnh thành phần trong giao tác và cần xử
lý những lỗi (nếu có): yêu cầu giao tác rollback một cách tường minh bằng lệnh
ROLLBACK TRANSACTION.
~ Liên hệ , so sánh về Transaction
trong SQL SERVER với Oracle ~
Bản chất của Transaction Control
Transaction với Trigger
+ Oracle : mọi thứ đều được xem như các transaction
+ SQL : mặc định thì không được hỗ trợ rõ ràng
Ví dụ sau về insert trùng khóa chính trong MS SQL và Oracle : SQL sẽ báo lỗi,
nhưng vẫn thực hiện các câu lệnh sau lỗi, còn Oracle thì transaction bị rollback
ngay khi lỗi xảy ra!
Trong Oracle không thể sử dụng COMMIT hay ROLLBACK như trong SQL
+ Oracle sử dụng raise_application_error để xuất lỗi, còn SQL là raiserror.
+ Do cơ chế quản lý transaction khác nhau, nên kết quả tương ứng cũng khác
nhau : khi có lỗi, Oracle rollback transaction đó ngay, còn SQL thì không. Cụ
thể là các câu lệnh sau raiserror và rollback của SQL vẫn thực hiện.
Transaction Control – SQL
SERVER
Transaction Control – ORACLE
SQL báo lỗi nhưng
vẫn thực hiện câu in
ra và insert. Câu
lệnh Insert này
không bị rollback.
Transaction với Trigger – SQL SERVER
Transaction với Trigger – ORACLE
THẢO LUẬN