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â
Trang 1GVHD: ThS Đỗ Thị Minh Phụng
Trang 23 Giao tác không tường minh (Implicit Transaction)
4 Giao tác tường minh (Explicit Transaction)
Trang 31 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
Trang 4Batch-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ế độ
Trang 5BATCH-SET IMPLICIT_TRANSACTION
(ON/ OFF)
BEGIN TRANSACTION
MARS Session
Trang 63 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)
Trang 84 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
Trang 9BEGIN 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
Trang 114.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.
Trang 154.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
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.
Trang 174.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
Trang 20~ 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
Trang 21Transaction Control – SQL SERVER
Trang 22Transaction Control – ORACLE
Trang 23SQL 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
Trang 24Transaction với Trigger – ORACLE
Trang 25THẢO LUẬN
Trang 26~ Sinh viên thực hiện ~ Hoàng Thái Hà - 07520098
Nguyễn Thiên Ân - 07520018
Nguyễn Ngọc Phúc - 07520282 Trần Thị Thanh Hương - 07520168