Bài giảng Hệ thống thông tin - Chương 6: Giới thiệu về giao tác - Phạm Nguyên Thảo
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Hệ thống thông tin - Chương 6: Giới thiệu về giao tác - Phạm Nguyên Thảo", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_he_thong_thong_tin_chuong_6_gioi_thieu_ve_giao_tac.pdf
Nội dung text: Bài giảng Hệ thống thông tin - Chương 6: Giới thiệu về giao tác - Phạm Nguyên Thảo
- Chương 6: Giới thiệu về giao tác 30-11-2006 Trường Đại học Khoa học Tự nhiên Khoa Công nghệ Thông tin Bộ môn Hệ thống Thông tin
- Giao tác (transaction) • Ví dụ : chuyển khoản 100$ từ tài khoản A sang tài khoản B (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 >= 100$ thì cộng 50$ vào tài khoản B • Giả sử vừa trừ tiền khỏi tài khoản A thì sự cố kỹ thuật xảy ra, và các bước tiếp theo không được thực hiện – A mất 100$ nhưng B không nhân được tiền (!?). • 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 transaction, nói cách khác là một đơn vị công việc nguyên tố. Chương VII : Transaction 2
- Khái niệm • Giao tác (transaction) là một tập hợp có thứ tự các thao tác. Tập hợp này được xem như một đơn vị công việc. – i.e. tất cả thao tác trong giao tác phải được thực hiện thành công, hoặc không thao tác nào được thực hiện. – nếu có một thao tác không hoàn thành được thì toàn bộ giao tác cũng không hoàn thành. • Giao tác chuyển CSDL từ tình trạng nhất quán này sang tình trạng nhất quán khác. Ngoài ra còn có tính chất ACID sẽ bàn đến dưới đây. 3
- Khái niệm (tt) • Một số thuật ngữ liên quan đến giao tác – Begin [transaction/tran] : bắt đầu một transaction – Commit [transaction/tran] : hoàn tất một transaction – Rollback [transaction/tran] : quay lui, hủy bỏ toàn bộ phần giao tác đã thực hiện trước đó 4
- Tính chất của giao tác: ACID • Tính nguyên tố (Atomic) : tất cả thao tác trong giao tác phải được thực hiện thành công, hoặc không thao tác nào được thực hiện. • Tính nhất quán (Consistency) : Chuyển CSDL từ tình trạng nhất quán này sang tình trạng nhất quán khác. 5
- Tính chất của giao tác (tt) • Tính độc lập (Isolation) : xử lý của một giao tác phải độc lập với những tác động (thấy or thay đổi dữ liệu) của các giao tác khác thực hiện đồng thời • Tính bền vững (Durability) : Sau khi giao tác commit thành công, tất cả những thay đổi trên CSDL mà giao tác đã thực hiện phải được ghi nhận chắc chắn (vào ổ cứng). – HQT CSDL luôn phải có cơ chế phục hồi dữ liệu để đảm bảo điều này, thường dùng cơ chế ghi nhận bằng transaction log. 6
- Ghi chú : Đảm bảo tính Automic • Để đảm bảo tính chất A của giao tác Người sử dụng phải tường minh điều khiển sự rollback của giao tác. • Cần kiểm tra lỗi sau khi thực hiện mỗi thao tác trong giao tác để có thể xử lý rollback kịp thời. – Trong SQL Server, dùng biến toàn cục @@error và @@rowcount 12
- Cài đặt thêm sinh viên • Dùng Stored: Create proc . Begin /*Goi lệnh insert thêm mới vào SinhVien*/ /* Đọc và kiểm tra SiSo lớp */ /* Nếu SiSo >= Max , báo lỗi */ rollback transaction /*Cập nhật tăng sỉ số*/ /* Nếu có lỗi khi thực hiện thao tác :*/ rollback transaction End 13
- Ví dụ - kiểm lỗi bằng @@error Create proc sp_ThemSV @MaSV int, @MaLop int As begin transaction declare @SiSo int select @SiSo = SiSo from LOP where MaLop = @MaLop if(@SiSo>=Max) begin rollback transaction return end 14
- Ví dụ (tt) Insert into SINH_VIEN(MaSV,MaLop) values(@MaSV,@MaLop) if(@@error<>0) begin rollback transaction return end 15
- Ví dụ (tt) update LOP set SiSo = SiSo+1 where MaLop = @MaLop if(@@error<>0) begin rollback transaction return end commit transaction /* hoàn tất giao tác*/ /*end stored proc*/ 16
- Các vấn đề liên quan đến xử lý truy xuất đồng thời • Lost Update (mất dữ liệu cập nhật) • Dirty read (đọc dữ liệu “rác”) • Unrepeatable read (không thể đọc lặp lại) • Phantom (“bóng ma”) 17
- • Mất dữ liệu cập nhật (Lost update) – Tình trạng này xảy ra khi có nhiều hơn một giao tác cùng thực hiện cập nhật trên 1 đơn vị dữ liệu. Khi đó, tác dụng của giao tác cập nhật thực hiện sau sẽ đè lên tác dụng của thao tác cập nhật trước. • Đọc dữ liệu chưa commit (Uncommitted data, Dirty read) – Xảy ra khi một giao tác thực hiện đọc trên một đơn vị dữ liệu mà đơn vị dữ liệu này đang bị cập nhật bởi một giao tác khác nhưng việc cập nhật chưa được xác nhận đã hoàn tất. 18
- • Thao tác đọc không thể lặp lại (Unrepeatable data) – Tình trạng này xảy ra khi một giao tác T1 vừa thực hiện xong thao tác đọc trên một đơn vị dữ liệu (nhưng chưa commit) thì giao tác khác (T2) lại thay đổi (ghi) trên đơn vị dữ liệu này. Điều này làm cho lần đọc sau đó của T1 không còn nhìn thấy dữ liệu ban đầu nữa. • Bóng ma (Phantom) – Là tình trạng mà một giao tác đang thao tác trên một tập dữ liệu nhưng giao tác khác lại chèn thêm hoặc xóa đi các dòng dữ liệu vào tập dữ liệu mà giao tác kia quan tâm. 19
- Cách giải quyết các vấn đề • Dùng khái niệm giao tác • và Dùng cơ chế khoá – Write lock (exclusive lock) – Read lock (shared lock) – Các hệ quản trị cụ thể còn có những loại khoá mở rộng khác : updlock, holdlock, – Đặt khóa vào đơn vị dữ liệu Tự động (đặt mức cô lập cho giao tác) Thủ công (đặt cấp độ khóa trong câu SELECT) 20
- Nội dung trình bày • Giao tác (Transaction) • 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 VII : Transaction 21
- 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. Sở dĩ như vậy vì HQT hỗ trợ xử lý đồng thời các thao tác đọc nhưng ghi phải ghi lần lượt. Chương VII : Transaction 22
- Chế độ khóa • Bảng tương thích giữa các chế độ khóa gt T S U X vs gt T’ S U X Tương thích: T’ không phải chờ T Không tương thích: T’ phải chờ T giải phóng khóa Chương VII : Transaction 23
- Chế độ khóa • Khi một transaction 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 transaction 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 VII : Transaction 24
- Nội dung trình bày • Giao tác (Transaction) • 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 VII : Transaction 25
- 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 VII : Transaction 26
- Khai báo tường minh giao tác • Các chỉ thị : – Begin tran : Đặt trước dòng lệnh đầu tiê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 VII : Transaction 27
- 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) Chương VII : Transaction 28
- 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 gọi lệnh return để kết thúc SP (tính automic) Chương VII : Transaction 29
- Khai báo tường minh giao tác • Ví dụ đoạn lệnh kiểm lỗi trong giao tác If @@error <> 0 Begin Print ‘ ’ Rollback tran Khối lệnh kiểm Return tra lỗi End Chương VII : Transaction 30
- Nội dung trình bày • Giao tác (Transaction) • 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 VII : 31 Transaction
- Mức cô lập cho giao tác • Mục đích: tự động đặt khóa cho các thao tác (đọc) trong kết nối dữ liệu hiện hành. 32
- Mức cô lập cho giao tác • Ghi chú – Tầm vực của Isolation level là ở mức connection chứ không phải mức transaction. Khi 1 connection N được đặt mức cô lập X thì X sẽ phát huy hiệu lực trên tất cả các transaction Ti chạy trên N. – Mức cô lập chỉ quyết định cách phát và giữ khóa S của transaction (vì khóa X luôn được phát ra khi ghi). Mức cô lập không quan tâm khóa U Chương VII : 33 Transaction
- Mức cô lập cho giao tác • Bốn mức cô lập mà SQL Server cung cấp – Read Uncommited : Không phát S khi đọc. Có nhu cầu đọc tức thời, e.g. khi cần đánh giá tổng quát toàn hệ thống. Tuy nhiên, không giải quyết được bất cứ vấn đề xử lý đống thời nào. – Read Commited : Phát S khi đọc, giải phóng S ngay sau khi đọc. Chỉ giải quyết được Dirty Read Chương VII : 34 Transaction
- Mức cô lập cho giao tác • Bốn mức cô lập mà SQL Server cung cấp – Repeatable Read : Phát S khi đọc và giữ S đến khi transaction kết thúc. Không ngăn chặn lệnh insert/delete dữ liệu thoả điều kiện thiết lập S. Giải quyết được Dirty Read và Unrepeatable Read – Seralizable : Giống Repeatable Read nhưng có ngăn chặn lệnh insert/delete dữ liệu thoả điều kiện thiết lập S. Giải quyết được Dirty Read và Unrepeatable Read và Phantom Chương VII : 35 Transaction
- Mức cô lập cho giao tác • Thiết lập : – Đặt lệnh thiết lập cần thiết trước khi bắt đầu giao tác. – Thiết lập mặc định là Read Commited. – Lệnh thiết lập : Set transaction Isolation level Tên_MứcCôLập – Ví dụ : Set transaction Isolation level Read Commited Set transaction Isolation level Serializable Chương VII : 36 Transaction
- Nội dung trình bày • Giao tác (Transaction) • 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 VII : 37 Transaction
- Các cấp độ khóa • Đặt vấn đề : Mức cô lập là chưa đủ – Mức cô lập quyết định cách phát và giữ khóa S trong một transaction và có hiệu lực trên tất cả các thao tác đọc trong transaction đó. – Thực tế, ta cần phát và giữ khóa S theo các cách khác nhau cho các thao tác đọc khác nhau trong cùng một transaction – Ngoài ra, ta cũng cần dùng nhiều dạng khóa linh động hơn là chỉ 1 loại khóa S đơn giản Chương VII : 38 Transaction
- Các cấp độ khóa • Khái niệm – Cấp độ khóa là các loại khóa khác nhau (không chỉ khóa S) được gắn vào từng table trong mệnh đề from của từng thao tác select – Ngoài lệnh select, cấp độ khóa còn có thể gắn vào các câu lệnh cập nhật, tuy nhiên ở đây ta chỉ quan tâm câu select Chương VII : 39 Transaction
- Các cấp độ khóa • Các cấp độ khóa – Read Uncommited / No lock – Read Commited (mặc định) – Repeatable – Serializable / Hold lock – Updlock – Tablock – TablockX – ReadPast Chương VII : 40 Transaction
- Các cấp độ khóa • Cách thiết lập Select From {Tab1 Alias1 with Lock_mode [, n]} [, n] Where • Ví dụ : Select SV.HoVaTen, K.TenKhoa From SinhVien SV with ReadCommite, Khoa K with Updlock Where SV.Khoa = K.Ma And Year(SV.NgaySinh) >= 1983 Chương VII : 41 Transaction
- Các cấp độ khóa • Phối hợp với Isolation Level – Trong transaction luôn có các thao tác yêu cầu bảo vệ nghiêm ngặt và các thao tác ít yêu cầu bảo vệ nghiêm ngặt – Dùng Isolation level ứng với yêu cầu bảo vệ ít nghiêm ngặt nhất – Bổ sung lock mode vào các thao tác yêu cầu bảo vệ nghiêm ngặt hơn mức mà Isolation level đó cung cấp. Chương VII : 42 Transaction
- Các cấp độ khóa • Khóa với dữ liệu trong cursor – Nếu cursor là loại tĩnh (static) thì các đơn vị dữ liệu đọc ra sẽ được lock ngay khi vừa Open cursor – Nếu cursor là loại động (dynamic) thì fetch đến đâu sẽ khóa đến đó – Cách phát khóa và giữ khóa là do mức cô lập của connection và các lock mode trong câu select định nghĩa cursor quyết định Chương VII : 43 Transaction
- Nội dung trình bày • Giao tác (Transaction) • 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 VII : 44 Transaction
- Dead lock • Khái niệm – Khi xử lý đồng thời, không tránh khỏi việc transaction này phải chờ đợi transaction khác – Nếu vì lý do gì đó mà hai transaction lại chờ lẫn nhau vĩnh viễn, không cái nào trong hai có thể hoàn thành được thì ta gọi đó là hiện tượng Dead Lock Chương VII : 45 Transaction
- Dead lock • Phân loại – Cyclic Deadlock – Conversion Deadlock Chương VII : 46 Transaction
- Dead lock • Phân loại – Cyclic Deadlock T1 T2 Giữ khóa A Đơn vị DL 1 DEAD Đơn vị DL 2 Giữ khóa B Trên đơn vị DL 1 LOCK Trên đơn vị DL 2 Đơn vị DL 2 Đơn vị DL 1 Cần phát khóa A2 Cần phát khóa B2 (không tương thích với A) (không tương thích với B) Trên đơn vị DL 2 Trên đơn vị DL 2 Chương VII : 47 Transaction
- Dead lock • Phân loại – Conversion Deadlock T1 T2 Giữ S-Lock Giữ S-Lock Đơn vị dữ liệu A Nâng cấp Nâng cấp thành X-Lock thành X-Lock DEAD LOCk Chương VII : 48 Transaction
- Dead lock • Khi dead lock xảy ra – SQL Server sẽ chọn 1 trong 2 transaction gây dead lock để hủy bỏ, khi đó transaction còn lại sẽ được tiếp tục thực hiện cho đến khi hoàn tất – Transaction bị chọn hùy bỏ là transaction mà SQL ước tính chi phí cho phần việc đã làm được ít hơn transaction còn lại. Chương VII : 49 Transaction