🎮Concurrency Control
Kiểm soát tính đồng thời – DBMS Concurrency Control
Khái niệm kiểm soát tính đồng thời
Kiểm soát tính đồng thời là một cách thức trong hệ quản trị cơ sở dữ liệu, DBMS, được sử dụng để quản lý các hoạt động hay sự kiện đồng thời xảy ra trong cơ sở dữ liệu mà không làm xung đột lẫn nhau. Kiểm soát tính đồng thời được sử dụng để giải quyết những xung đột chủ yếu xảy ra với hệ thống có nhiều người dùng cùng lúc. Nó đảm bảo rằng các giao dịch trong cơ sở dữ liệu được thực hiện đồng thời mà không vi phạm tính toàn vẹn dữ liệu của cơ sở dữ liệu khác tương ứng. Nếu tất cả người dùng cùng đang đọc một dữ liệu thì việc kiểm soát đồng thời sẽ được thực hiện một cách dễ dàng để đảm bảo không có trường hợp các người dùng này có thể can thiệp lên việc của nhau. Đối với bất kỳ cơ sở dữ liệu nào cũng sẽ có sự kết hợp giữa các thao tác đọc và ghi dữ liệu, do đó điều này sẽ gây khó khăn hơn cho việc đảm bảo quản lý tính đồng thời.
Do đó, kiểm soát tính đồng thời là một yếu tố quan trọng đối với việc hoạt động bình thường của một hệ thống khi có hai hoặc nhiều giao dịch yêu cầu quyền truy cập vào cùng một cơ sở dữ liệu cùng một lúc.
Các vấn đề có thể xảy ra khi tồn tại tính đồng thời
Các cập nhật dữ liệu sẽ bị mất khi nhiều giao dịch cùng truy cập vào một dữ liệu và cùng cập nhật dữ liệu đó.
Sẽ xảy ra việc giao dịch thứ hai sẽ đọc được dữ liệu đang được cập nhật bởi một giao dịch khác trong khi giao dịch này vẫn chưa hoàn tất.
Sẽ xảy ra tình trạng giao dịch thứ hai đang truy cập vào cùng một dữ liệu nhiều lần với các thời điểm khác nhau và sẽ đọc được các dữ liệu bị thay đổi liên tục. Do đó thông tin lấy được sẽ không đảm bảo tính chính xác.
Khi một giao dịch đang tính tổng giá trị của tất cả các dữ liệu và giao dịch thứ hai đang thay đổi giá trị của các dữ liệu đó. Trong tình huống này, kết quả trả về sẽ là không chính xác.
Tại sao sử dụng phương pháp kiểm soát đồng thời?
Để đảm bảo tính cô lập với các giao dịch đang xung đột lẫn nhau khi các thao tác đọc và ghi xảy ra cùng lúc.
Để duy trì tính nhất quán của cơ sở dữ liệu.
Kiểm soát đồng thời giúp đảm bảo khả năng tuần tự hóa của dữ liệu.
Ví dụ: Giả sử rằng hai người đến cùng một lúc vào quầy bán vé ở rạp chiếu phim để mua vé xem phim cho cùng một bộ phim và cùng một giờ chiếu. Tuy nhiên, chỉ còn một chỗ ngồi cho buổi chiếu phim tại rạp đó. Nếu không có kiểm soát tính đồng thời, có thể cả hai người sẽ mua được hai vé cho cùng một chỗ ngồi vào cùng một thời điểm và do đó khi đi xem phim thì cả hai người này có thể tranh chấp với nhau. Do vậy, phương pháp điều khiển đồng thời sẽ đảm bảo điều này là không xảy ra. Cả hai người vẫn có thể đến mua vé để xem phim. Nhưng kiểm soát đồng thời sẽ chỉ cung cấp một vé cho người mua trước.
Các giao thức kiểm soát tính đồng thời
Các giao thức sử dụng khóa (Lock-Based Protocols)
Giao thức sử dụng hai pha (Two Phase - 2PL)
Giao thức dựa vào mốc thời gian (Timestamp-Based Protocols)
Giao thức sử dụng việc hợp thức hóa (Validation-Based Protocols)
Giao thức sử dụng khóa
Khóa là một biến dữ liệu được liên kết với một phần tử dữ liệu (chính là một hàng trong bảng của hệ quản trị cơ sở dữ liệu). Khóa này sẽ thông báo rằng các thao tác có thể được thực hiện trên phần tử dữ liệu. Khóa giúp đồng bộ hóa quyền truy cập vào các phần tử dữ liệu trong cơ sở dữ liệu. Tất cả các yêu cầu khóa được đưa tới trình kiểm soát tính đồng thời. Các giao dịch chỉ được tiến hành sau khi yêu cầu cho khóa được cấp. Có 2 kiểu cơ chế khóa là:
Khóa nhị phân (Binary locks): Khóa nhị phân được thực hiện trên một phần tử dữ liệu có thể ở trạng thái bị khóa hoặc mở khóa.
Chia sẻ / độc quyền (Shared/exclusive lock): Loại cơ chế khóa này sẽ phân biệt các khóa dựa trên mục đích sử dụng của các khóa đó. Nếu một khóa được áp dụng cho một phần tử dữ liệu để thực hiện thao tác ghi, nó sẽ được gọi là khóa độc quyền.
1. Khóa chia sẻ (Shared lock)
Khóa chia sẻ còn được gọi là khóa chỉ thực hiện việc đọc. Với khóa chia sẻ, phần tử dữ liệu trong cơ sở dữ liệu có thể được dùng chung giữa các giao dịch. Điều này là do bởi người dùng sẽ không bao giờ có quyền cập nhật hay thay đổi dữ liệu này.
Ví dụ: Hai giao dịch đang đọc số dư tài khoản của cùng một người. Cơ sở dữ liệu sẽ cho phép chúng được đọc bằng cách đặt một khóa chia sẻ. Tuy nhiên, nếu một giao dịch khác muốn cập nhật hoặc thay đổi số dư của tài khoản đó, khóa chia sẻ sẽ ngăn chặn điều đó cho đến khi quá trình đọc kết thúc.
2. Khóa độc quyền (Exclusive lock)
Với khóa độc quyền, một phần tử dữ liệu có thể được đọc hoặc ghi. Các giao dịch có thể mở khóa cho phần tử dữ liệu sau khi kết thúc một thao tác đọc hoặc ghi.
Ví dụ: Khi giao dịch cần cập nhật số dư tài khoản của một người. Người dùng có thể cho phép giao dịch này sử dụng khóa độc quyền. Do đó, khi giao dịch thứ hai muốn đọc hoặc ghi, khóa độc quyền sẽ ngăn chặn các thao tác đọc hoặc ghi của giao dịch thứ hai này.
3. Giao thức khóa đơn giản (Simplistic Lock Protocol)
Cho phép các giao dịch áp dụng khóa trên mỗi dữ liệu trước khi bắt đầu một thao tác. Các giao dịch có thể mở khóa cho phần tử dữ liệu sau khi kết thúc thao tác ghi hoặc đọc.
4. Khóa đặt trước quyền sở hữu (Pre-claiming Locking)
Giúp đánh giá các thao tác và tạo danh sách cho các mục dữ liệu cần được thực thi. Trong tình huống khi tất cả các khóa được cấp, giao dịch sẽ được thực hiện. Sau đó, tất cả các khóa sẽ được bỏ sau khi tất cả các thao tác kết thúc.
Hai tình huống khi các khóa không được áp dụng:
1. Starvation là tình trạng khi một giao dịch đợi trong một khoảng thời gian không xác định để có được khóa.
Sau đây là các nguyên nhân gây ra :
Khi việc sắp xếp cho các mục dữ liệu bị khóa không được quản lý đúng cách
Trong trường hợp rò rỉ tài nguyên
Cùng một giao dịch được thực hiện nhiều lần
2. Deadlock: là tình trạng trong đó hai hoặc nhiều tiến trình đang chờ nhau để giải phóng tài nguyên hoặc hai tiến trình đang chờ tài nguyên nằm trong một tiến trình khác và cứ như tiếp tục như vậy cho tới khi không có tiền trình nào nhường tài nguyên cho tiến trình cần tài nguyên đó.
Giao thức sử dụng khóa trong hai pha
Giao thức sử dụng khóa trong hai pha được viết tắt là 2PL. Trong loại giao thức khóa này, giao dịch sẽ lấy được một khóa khác sau khi nó giải phóng đi một trong các khóa của nó. Giao thức khóa này chia giai đoạn thực hiện của một giao dịch thành ba pha khác nhau.
Pha phát triển (Growing Phase): Khi giao dịch bắt đầu thực hiện, nó yêu cầu việc cấp phép cho khóa mà nó cần. Trong giai đoạn này, giao dịch có thể nhận thêm được khóa nhưng không thể giải phóng bất kỳ khóa nào.
Pha khóa (Locked phase): Giao dịch có đủ các khóa nó cần và thực hiện các thao tác. Khi giao dịch giải phóng khóa đầu tiên của nó, pha thứ ba sẽ bắt đầu.
Pha thu hẹp (Shrinking Phase): Trong giai đoạn này, một giao dịch có thể giải phóng khóa nhưng không nhận được bất kỳ khóa mới nào.
Tuy nhiên, giao thức này vẫn không đảm bảo rằng vấn đề Deadlock sẽ không xảy ra. Trong sơ đồ đã cho ở trên, bạn có thể thấy rằng các trình phát hiện tình trạng Deadlock cục bộ và toàn cục đang tìm kiếm các trạng thái Deadlock và xử lý bằng cách bắt đầu lại các giao dịch ở trạng thái ban đầu của chúng.
1. Giao thức 2PL tuyệt đối (Strict-2PL)
Phương pháp này tương tự như 2PL thông thường. Sự khác biệt giữa hai cơ chế này là Strict 2PL sẽ không bao giờ giải phóng khóa sau khi sử dụng nó. Nó giữ tất cả các khóa cho đến khi thực hiện lưu trữ hoàn tất các thay đổi và giải phóng tất cả các khóa cùng một lúc khi quá trình kết thúc.
2. Giao thức 2PL tập trung (Centralized 2PL)
Chỉ có một điểm duy nhất sẽ thực hiện quá trình quản lý khóa. Nó chỉ có một trình quản lý khóa cho toàn bộ hệ thống quản trị cơ sở dữ liệu, DBMS.
3. Giao thức 2PL sao chép bản chính (Primary copy 2PL)
Nhiều trình quản lý khóa được phân phối đến các điểm khác nhau. Sau đó, một trình quản lý khóa cụ thể sẽ đảm bảo việc quản lý khóa cho một tập hợp các phần tử dữ liệu. Khi bản sao chính đã được cập nhật, thì các thay đổi sẽ được thực hiện trên các bản còn lại.
4. Giao thức 2PL phân phối (Distributed 2PL)
Trong loại cơ chế khóa này, các trình quản lý khóa được phân phối đến tất cả các điểm. Chúng đảm bảo việc quản lý khóa cho các dữ liệu tại điểm đó. Nếu không có dữ liệu nào được sao chép, thì nó sẽ tương đương với phương pháp Primary copy 2PL.
Giao thức dựa vào mốc thời gian
Sử dụng mốc thời gian để tuần tự hóa việc thực hiện các giao dịch đồng thời. Giao thức này đảm bảo rằng mọi hoạt động đọc và ghi xung đột đều được thực thi theo thứ tự các mốc thời gian. Giao thức sử dụng Phép tính thời gian của hệ thống hoặc Phép đếm logic làm mốc thời gian. Giao dịch vào trước luôn được ưu tiên hơn trong phương pháp này. Nó sử dụng thời giancủa hệ thống để xác định các mốc thời gian của giao dịch.
Các giao thức này giúp quản lý thứ tự giữa các giao dịch gây xung đột lẫn nhau khi chúng được thực hiện. Các giao thức dựa trên mốc thời gian sẽ quản lý sự xung đột ngay sau khi một thao tác được khởi tạo.
Ví dụ: Giả sử có giao dịch T1, T2 và T3.
T1 vào hệ thống lúc 0010
T2 vào hệ thống lúc 00h20
T3 vào hệ thống lúc 00h30
Lúc này, các giao thức sẽ đảm bảo thứ tự ưu tiên sẽ là giao dịch T1, sau đó là giao dịch T2 và cuối cùng là giao dịch T3.
Giao thức sử dụng việc hợp thức hóa
Trong phương pháp này, sẽ không có việc kiểm tra nào được thực thi trong khi giao dịch đang được thực hiện. Khi kết thúc giao dịch, các cập nhật hoặc thay đổi trong giao dịch không được áp dụng trực tiếp vào cơ sở dữ liệu, mà các thay đổi đó được được áp dụng cho các bản sao cục bộ của các phần tử dữ liệu được lưu giữ cho giao dịch đó. Ở giai đoạn cuối cùng của giao dịch, một giai đoạn xác thực sẽ được thực hiện để kiểm tra xem bất kỳ các thao tác thay đổi của một giao dịch có vi phạm việc tuần tự hóa hay không. Nếu không có vi phạm, giao dịch được hoàn tất lưu trữ và cơ sở dữ liệu được cập nhật. Nếu không, giao dịch sẽ được bắt đầu lại.
Đặc điểm của các giao thức kiểm soát tính đồng thời
Phải có khả năng khổi phục lại các sự cố tại các điểm dữ liệu và các lỗi trong quá trình giao tiếp.
Nó cho phép thực hiện song song các giao dịch để đạt được tính đồng thời tối đa.
Các cơ chế lưu trữ và phương pháp tính toán là vừa đủ để giảm thiểu chi phí.
Thực hiện một số ràng buộc cho cấu trúc của các thao tác độc lập của các giao dịch.
Last updated