1.1 Giới thiệu
Và bây giờ niềm vui bắt đầu - lý thuyết về cách thức hoạt động của các giao dịch. Làm cách nào để giữ cho hệ thống hoạt động khi bạn thay đổi cùng một dữ liệu trong các luồng khác nhau? Hay bạn muốn thực hiện một giao dịch trong một giao dịch khác? Chúng tôi sẽ bắt đầu tìm kiếm câu trả lời cho những câu hỏi này bằng cách nghiên cứu sự cô lập của các giao dịch ...
Mức cô lập giao dịch là một giá trị có điều kiện xác định mức độ cho phép dữ liệu không nhất quán do việc thực hiện các giao dịch song song logic trong DBMS. Quy mô của các mức cô lập giao dịch chứa một số giá trị, được xếp hạng từ thấp nhất đến cao nhất; mức cô lập cao hơn tương ứng với tính nhất quán của dữ liệu tốt hơn, nhưng việc sử dụng nó có thể làm giảm số lượng giao dịch song song về mặt vật lý.
Ngược lại, mức cô lập thấp hơn cho phép nhiều giao dịch song song hơn nhưng làm giảm độ chính xác của dữ liệu. Do đó, khi chọn mức độ cô lập giao dịch được sử dụng, nhà phát triển hệ thống thông tin, ở một mức độ nhất định, đưa ra lựa chọn giữa tốc độ công việc và đảm bảo tính nhất quán được đảm bảo của dữ liệu nhận được từ hệ thống.
Các vấn đề về truy cập đồng thời bằng cách sử dụng các giao dịch
Khi các giao dịch được thực hiện song song, các vấn đề sau có thể xảy ra:
- cập nhật bị mất - nếu một khối dữ liệu bị thay đổi đồng thời bởi các giao dịch khác nhau, tất cả các thay đổi sẽ bị mất, ngoại trừ khối dữ liệu cuối cùng;
- đọc "bẩn" (anh. Đọc bẩn) - đọc dữ liệu được thêm hoặc thay đổi bởi một giao dịch, dữ liệu này sau đó sẽ không được xác nhận (khôi phục);
- đọc không lặp lại (eng. non-repeatable read) - khi đọc lại trong cùng một giao dịch, dữ liệu đã đọc trước đó bị thay đổi;
- đọc ma - một giao dịch trong khi thực hiện nhiều lần sẽ chọn nhiều hàng theo cùng một tiêu chí. Một giao dịch khác ở giữa các lần tìm nạp này sẽ thêm các hàng hoặc sửa đổi các cột của một số hàng được sử dụng trong tiêu chí tìm nạp của giao dịch đầu tiên và kết thúc thành công. Kết quả là, các lựa chọn giống nhau trong giao dịch đầu tiên sẽ cho các tập hợp hàng khác nhau.
Xem xét các tình huống trong đó những vấn đề này có thể xảy ra.
1.2 Mất cập nhật
Tình huống khi một khối dữ liệu được thay đổi đồng thời bởi các giao dịch khác nhau, một trong những thay đổi sẽ bị mất.
Giả sử có hai giao dịch đang chạy cùng một lúc:
Giao dịch 1 | Giao dịch 2 |
---|---|
CẬP NHẬT tbl1 SET f2=f2+20 WHERE f1=1; | CẬP NHẬT tbl1 SET f2=f2+25 WHERE f1=1; |
Trong cả hai giao dịch, giá trị của trường f2 thay đổi, sau khi hoàn thành, giá trị của trường phải tăng thêm 45. Trên thực tế, chuỗi hành động sau đây có thể xảy ra:
- Cả hai giao dịch đồng thời đọc trạng thái hiện tại của trường. Đồng thời vật lý chính xác không được yêu cầu ở đây, chỉ cần thao tác đọc thứ hai theo thứ tự được hoàn thành trước khi một giao dịch khác ghi kết quả của nó là đủ.
- Cả hai giao dịch đều tính toán giá trị trường mới bằng cách thêm 20 và 25 tương ứng vào giá trị đã đọc trước đó.
- Các giao dịch cố gắng ghi lại kết quả tính toán vào trường f2. Vì về mặt vật lý không thể thực hiện hai thao tác ghi cùng một lúc, nên trên thực tế, một trong các thao tác ghi sẽ được thực hiện trước, thao tác kia sau. Thao tác ghi thứ hai sẽ ghi đè lên kết quả của thao tác ghi đầu tiên.
Do đó, giá trị của trường f2, sau khi hoàn thành cả hai giao dịch, có thể tăng không phải 45 mà là 20 hoặc 25, tức là một trong các giao dịch thay đổi dữ liệu sẽ “biến mất”.
1.3 Cách đọc "bẩn"
Đọc dữ liệu được thêm hoặc sửa đổi bởi một giao dịch mà sau đó sẽ không thực hiện được (rollback).
Giả sử chúng ta có hai giao dịch được mở bởi các ứng dụng khác nhau thực thi các câu lệnh SQL sau:
Giao dịch 1 | Giao dịch 2 |
---|---|
CẬP NHẬT tbl1 SET f2=f2+1 WHERE f1=1; | |
CHỌN f2 TỪ tbl1 Ở ĐÂU f1=1; | |
QUAY LẠI CÔNG VIỆC; |
Trong giao dịch 1, giá trị của trường f2 được thay đổi, sau đó trong giao dịch 2, giá trị của trường này được chọn. Sau đó, giao dịch 1 được khôi phục, kết quả là giá trị mà giao dịch thứ 2 nhận được sẽ khác với giá trị được lưu trữ trong cơ sở dữ liệu.
1.4 Đọc không lặp lại
Tình huống khi đọc lại trong cùng một giao dịch, dữ liệu đã đọc trước đó bị thay đổi.
Giả sử chúng ta có hai giao dịch được mở bởi các ứng dụng khác nhau thực thi các câu lệnh SQL sau:
Giao dịch 1 | Giao dịch 2 |
---|---|
CHỌN f2 TỪ tbl1 Ở ĐÂU f1=1; | |
CẬP NHẬT tbl1 SET f2=f2+3 WHERE f1=1; | |
LÀM; | |
CHỌN f2 TỪ tbl1 Ở ĐÂU f1=1; |
Trong giao dịch 2, giá trị của trường f2 được chọn, sau đó trong giao dịch 1, giá trị của trường f2 được thay đổi. Nếu bạn thử lại để chọn một giá trị từ trường f2 trong giao dịch 2, bạn sẽ nhận được một kết quả khác. Tình huống này đặc biệt không thể chấp nhận được khi dữ liệu được đọc để sửa đổi một phần và ghi lại vào cơ sở dữ liệu.
1.5 Đọc "bóng ma"
Tình huống khi, trong quá trình đọc lặp lại trong cùng một giao dịch, cùng một lựa chọn đưa ra các tập hợp hàng khác nhau.
Giả sử có hai giao dịch được mở bởi các ứng dụng khác nhau thực thi các câu lệnh SQL sau:
Giao dịch 1 | Giao dịch 2 |
---|---|
CHỌN TỔNG (f2) TỪ tbl1; | |
CHÈN VÀO GIÁ TRỊ tbl1 (f1,f2)(15,20); | |
LÀM; | |
CHỌN TỔNG (f2) TỪ tbl1; |
Giao dịch 2 thực hiện một câu lệnh SQL sử dụng tất cả các giá trị của trường f2. Sau đó, một hàng mới được chèn vào giao dịch 1, khiến cho việc thực hiện lại câu lệnh SQL trong giao dịch 2 tạo ra một kết quả khác. Tình trạng này được gọi là đọc ảo (phantom reading). Nó khác với cách đọc không lặp lại ở chỗ kết quả của việc truy cập dữ liệu lặp lại đã thay đổi không phải do bản thân dữ liệu bị thay đổi/xóa, mà do sự xuất hiện của dữ liệu (ảo) mới.
GO TO FULL VERSION