CHƯƠNG VI: GIAO TÁC GV: TUẤN NGUYÊN HOÀI ĐỨC Email: tnhduc@fit.vn Nội dung trình bày • Giao tác (Transac.on) • Xử lý đồng thời (Concurrency) • Chế độ khóa • Khai báo tường minh giao tác • Mức cô lập • Các cấp độ khóa • Dead-lock Chương VI : Giao tác 2 Giao tác (transac7on) • Khái niệm • Chúng ta xây dựng CSDL là để lưu trữ thông :n và khai thác thông :n. Công việc này gọi chung là xử lý thông :n. • Thực tế tồn tại những bước xử lý thông :n tạo nên một đơn nguyên (atom) : những bước xử lý này hoặc là được thực hiện hết, hoặc là không thực hiện một bước nào. • Những đơn nguyên như vậy gọi là giao tác (transac:on) Chương VI : Giao tác 3 Giao tác (transaction) • Ví dụ : chuyển khoản 100$ từ tài khoản A sang tài khoản B (50$) và tài khoản C (50$).
Các bước thực hiện gồm : • Trừ 100$ khỏi tài khoản A • Nếu số dư trong A < 0 thì khôi phục số dư cũ và ngưng • Nếu số dư trong A >=0 thì • Cộng 50$ vào tài khoản B • Cộng 50$ vào tài khoản C • Nếu số dư trong A = 0 thì tất toán tài khoản A Chương VI : Giao tác 4 Giao tác (transac7on) • Ví dụ : • Giả sử vừa trừ :ền khỏi tài khoản A thì sự cố kỹ thuật sảy ra và các bước :ếp theo không được thực hiện à mất 100$ à Không chấp nhận được • Các bước xử lý nêu trên nếu đã làm thì phải làm cho hết, ngược lại thì không làm bước nào cả à chúng tạo thành một transac:on, nói cách khác là một đơn vị công việc nguyên tố. Chương VI : Giao tác 5 Giao tác (transaction) • Các anh chất : • Tính nguyên tố (Atomic) : Một giao tác là một đơn nguyên (atom), nghĩa là các công việc trong ấy không tách rời nhau được • Tính nhất quán (Consistent) : Một giao tác có thể làm thay đổi wnh trạng CSDL, nhưng không được làm mất xnh nhất quán vốn có của CSDL Chương VI : Giao tác 6 Giao tác (transac7on) • Các anh chất : • Tính cô lập (Isolated) : Công việc của một giao tác không thể bị chi phối hoặc phá hoại bởi các giao tác khác • Tính vững bền (Durable) : Kết quả làm việc của một giao tác phải được lưu trữ bền vững vào CSDL. Chương VI : Giao tác 7 Giao tác (transaction) • Các $nh chất : • Atomic • Consistent • Isolated • Durable ACID Chương VI : Giao tác 8 Giao tác (transac7on) • Các sự kiện của một giao tác • Begin tran : Giao tác bắt đầu • Commit tran : Giao tác hoàn tất thành công • Rollback tran : Giao tác thất bại và bị chấm dứt, mọi thay đổi nó thực hiện trên dữ liệu bị hủy bỏ, dữ liệu khôi phục trạng thái cũ. Không có tác dụng trên biến cục bộ • Save tran (không chính quy) : Ghi nhận bền vững một phần kết quả của giao tác xnh đến thời điểm save tran Chương VI : Giao tác 9 Nội dung trình bày • Giao tác (Transac.on) • Xử lý đồng thời (Concurrency) • Chế độ khóa • Khai báo tường minh giao tác • Mức cô lập • Các cấp độ khóa • Dead-lock Chương VI : Giao tác 10 Xử lý đồng thời (Concurrency) • Mô hình ứng dụng hiện nay là mô hình đa người dùng : Một CSDL lưu tại Server và nhiều clients đồng thời truy cập và thao tác trên cùng CSDL ấy • Một client X có thể thực hiện lần lượt các giao tác Ti của nó, trong khi một client Y có thể cũng đang lần lượt thực hiện các giao tác Tj của nó.
Chương VI : Giao tác 11 Xử lý đồng thời (Concurrency) • Các Ti và Tj đồng thời truy xuất và thay đổi CSDL trên server và có thể xung đột, tranh chấp lẫn nhau. • Việc dàn xếp các xung đột, tranh chấp này sao cho ổn thỏa và bào đảm nhất quán dữ liệu gọi là xử lý đồng thời (concurrency) Chương VI : Giao tác 12 Xử lý đồng thời (Concurrency) • Bản chất của các giao tác đồng thời : Các thao tác của những giao tác được DBMS đáp ứng theo cách mà CPU đáp ứng các lệnh từ các ứng dụng chạy trên một hệ điều hành đa nhiệm. • Các vấn đề xử lý đồng thời : Các giao tác đồng thời sẽ được xem là ổn nếu kết quả của chúng giống như trường hợp làm tuần tự từng giao tác một. Chương VI : Giao tác 13 Xử lý đồng thời (Concurrency) • Các vấn đề xử lý đồng thời • Mất dữ liệu cập nhật (Lost update) T1 T2 1.Read A Dữ liệu 5.a = A*3 cập nhật Ghi đè 6.Commit tran Chương VI : Giao tác 14 Xử lý đồng thời (Concurrency) • Các vấn đề xử lý đồng thời • Đọc dữ liệu rác (Dirty read) T1 T2 1.Rollback tran Vẫn 6.Write A,b Đơn vị dữ liệu A để 8.Commit tran vừa ghi không còn dùng ý nghĩa nữa Chương VI : Giao tác 15 Xử lý đồng thời (Concurrency) • Các vấn đề xử lý đồng thời • Không thể đọc lại (Unrepeatable read) T1 T2 1.Begin tran Đọc 2.Begin tran thấy 3.read A Thao Đọc n+1.Commit tran tác ghi thấy chen a_new ngang à Bất ngờ Chương VI : Giao tác 16 Xử lý đồng thời (Concurrency) • Các vấn đề xử lý đồng thời • Bóng ma (Phantom) T1 T2 1.Begin tran Đọc Thêm 2.Begin tran tập các hoặc 3.read {A [,…n]} đơn vị bớt 4….thay đổi thành phần dữ liệu thành của {A [,…n]} A viên 5.Commit tran …Xử lý {A [,…n]} n+1.Commit tran Xử lý thừa hoặc thiếu Chương VI : Giao tác 17 Nội dung trình bày • Giao tác (Transac.on) • Xử lý đồng thời (Concurrency) • Chế độ khóa • Khai báo tường minh giao tác • Mức cô lập • Các cấp độ khóa • Dead-lock Chương VI : Giao tác 18 Chế độ khóa • Mục đích : Tránh các vần đề về XL đồng thời vừa nêu • Cách thức : Một giao tác T, khi thao tác trên đơn vị dữ liệu A, có thể quy định mức độ quyền hạn của các giao tác T’ khác trên A bằng cách phát khóa trên A.
Chương VI : Giao tác 19 Chế độ khóa • Các loại khóa • Khóa chia sẻ (shared lock) : Còn gọi là khóa đọc (read lock). Gọi tắt : Khóa S • Khóa dự định ghi (Intend to write lock) : Còn gọi là khóa cập nhật (update lock). Gọi tắt : Khóa U • Khóa độc quyền (exclusive lock) : Còn gọi là khóa ghi (write lock). Gọi tắt : Khóa X.
Khóa X luôn được phát ra khi ghi, bất kể thông số hệ thống đang thiết lập thế nào. Chương VI : Giao tác 20 Chế độ khóa • Bảng tương thích giữa các chế độ khóa S U X S þ þ ý U þ ý ý X ý ý ý Chương VI : Giao tác 21 Chế độ khóa • Khi một transac.on Ti cần truy cập và thao tác trên một đơn vị dữ liệu X, nó sẽ đòi phát khóa A trên X. Nhưng khi ấy nếu transac.on Tj đang giữ khóa B trên X (và khóa A với khóa B không tương thích) thì Ti phải đợi Tj giải phóng khóa B trên X nó mới phát được khóa A trên X à Hiện tượng chờ đợi lẫn nhau. Chương VI : Giao tác 22 Nội dung trình bày • Giao tác (Transac.on) • Xử lý đồng thời (Concurrency) • Chế độ khóa • Khai báo tường minh giao tác • Mức cô lập • Các cấp độ khóa • Dead-lock Chương VI : Giao tác 23 Khai báo tường minh giao tác • Trong SQL Server, ta có thể khai báo tường minh các giao tác, có thể là trên một khối lệnh độc lập hay trong thân một thủ tục thường trú.
• Ngoài ra SQL Server còn có thể phát sinh các giao tác ngầm định (Ví dụ : Trigger) Chương VI : Giao tác 24 Khai báo tường minh giao tác • Các chỉ thị : • Begin tran : Đặt trước dòng lệnh đầu :ên của giao tác (1 chỉ thị duy nhất cho 1 giao tác) • Commit tran : Đặt sau dòng lệnh cuối cùng hoàn tất giao tác (1 chỉ thị duy nhất cho 1 giao tác) ? • Rollback tran : Đặt tại các vị trí kiểm lỗi hay các nhánh rẽ logic ứng với trường hợp nghiệp vụ thất bại. (nhiều chỉ thị cho 1 giao tác) Chương VI : Giao tác 25 Khai báo tường minh giao tác • Kiểm lỗi trong giao tác • Lỗi có thể sảy ra sau các thao tác : • Insert, Update (trùng khóa chính, sai kiểu dữ liệu, sai định dạng ngày tháng,…) • Delete (ràng buộc tồn tại,…) • Select (login không có quyền trên object…) • Sau mỗi thao tác trên phải kiểm lỗi bằng biến hệ thống @@error (=0 à không có lỗi,≠0 à có lỗi) • Có thể không kiểm tra lệnh select để tránh làm cho giao tác quá cồng kềnh (vì lỗi này ít khi sảy ra và có thể khống chế được so với 2 loại lỗi cón lại) Chương VI : Giao tác 26 Khai báo tường minh giao tác • Kiểm lỗi trong giao tác • Khi lỗi sảy ra (@@error ≠ 0), cần thực hiện các công việc : • Báo lỗi (nếu cần) bằng các lệnh print hay raise error • Rollback tran (bắt buộc) • Nếu Tran khai báo trong SP thì thông thường phải ngưng ngay SP ấy bằng lệnh return Chương VI : Giao tác 27 Khai báo tường minh giao tác • Kiểm lỗi trong giao tác If @@error <> 0 Begin Print ‘…’ Rollback tran Return End Khối lệnh kiểm tra lỗi Chương VI : Giao tác 28 Khai báo tường minh giao tác • Ví dụ Create proc TongTien @MaDH varchar(10) As Declare @ThanhTien float Declare @TienThue float Declare @TienChietKhau float Declare @DonGia float,@SoLuong int Begin tran Set @SoLuong = (select SoLuong from DonHang where Ma = @MaDH) --Khối lệnh kiểm tra lỗi Chương VI : Giao tác 29 Khai báo tường minh giao tác • Ví dụ Set @DonGia = (select DonGia from DonHang where Ma = @MaDH) --Khối lệnh kiểm tra lỗi Set @TienThue = (select ThueSuat from DonHang where Ma = @MaDH) --Khối lệnh kiểm tra lỗi Set @TienChietKhau = (select ChietKhau from DonHang where Ma = @MaDH) --Khối lệnh kiểm tra lỗi Set @ThanhTien = @DonGia*@SoLuong Set @TienThue = @ThanhTien*@TienThue/100 Set @ThanhTien = @ThanhTien + @TienThue Chương VI : Giao tác 30 Khai báo tường minh giao tác • Ví dụ Set @TienChietKhau = @ThanhTien*@TienChietKhau/100 Set @ThanhTien = @ThanhTien - @TienChietKhau Update DonHang set ThanhTien = @ThanhTien where Ma = @MaDH --Khối lệnh kiểm tra lỗi Commit tran Go Chương VI : Giao tác 31 Nội dung trình bày • Giao tác (Transac.