Giao dịch Transactions Mục đích của giao dịch là đảm bảo các đối tượng luôn ở trạng thái nhất quán khi chúng được truy cập bởi nhiều giao dịch hoặc trong trường hợp có lỗi xảy ra Khái ni
Trang 1CHƯƠNG 16 – GIAO DỊCH VÀ KIỂM SOÁT ĐỒNG THỜI
1 Giao dịch
2 Giao dịch lồng nhau
3 Kiểm soát truy cập đồng thời
4 Khóa
5 Kiểm soát đồng thời tin cậy
6 Nhãn thời gian
1
Giao dịch (Transactions)
Mục đích của giao dịch là đảm bảo các đối tượng luôn ở trạng
thái nhất quán khi chúng được truy cập bởi nhiều giao dịch hoặc trong trường hợp có lỗi xảy ra
Khái niệm về Hoạt động nguyên tử
Việc sử dụng các luồng cho phép nhiều client có thể cùng truy cập vào một đối tượng Vì vậy, các phương thức của đối tượng cần được thiết kế để sử dụng trong bối cảnh đa luồng.
Nếu một luồng gọi 1 phương thức trên 1 đối tượng thì đối tượng
đó sẽ bị khóa Nếu một luồng khác gọi phương thức đó thì nó sẽ
bị khóa cho đến khi khóa được giải phóng.
Các hoạt động mà không bị can thiệp từ các hoạt động đồng thời
đang được thực thi bởi các luồng khác được gọi là hoạt động nguyên tử
Trong một số trường hợp, các client đòi hỏi một chuỗi các yêu
cầu riêng biệt, yêu cầu đặt ra là:
- Chúng không bị can thiệp bởi các hành động đồng thời từ các client khác.
- Hoặc tất cả các hành động phải thực hiện thành công, hoặc không có một hành động nào thành công nếu máy chủ bị lỗi.
Ví dụ:
Thực hiện một giao dịch chuyển tiền giữa 2 tài khoản ngân hàng: Tài khoản A và B tương ứng có $500 và $100;
Cần chuyển $300 từ tài khoản A sang tài khoản B
Trang 2Sẽ có 2 lệnh cập nhật như sau:
- Trừ số tiền hiện có của tài khoản A đi $300
- Cộng thêm số tiền hiện có của tài khoản B thêm $300
Nếu 2 lệnh diễn ra độc lập (không cùng 1 giao dịch), vì một
lý do nào đó, lệnh thứ 2 bị lỗi, khi đó tài khoản A sẽ còn $200
và tài khoản B vẫn giữ nguyên $100
Điều này là không thể chấp nhận được vì $300 bỗng dưng biến mất.
Nếu thực hiện 2 lệnh trên trong cùng 1 giao dịch, nó sẽ đảm
bảo
- Hoặc cả 2 lệnh đều cập nhật thành công
- Hoặc trong trường hợp có lỗi thì cả 2 lệnh đều bị hủy
Năm 1983, Cụm từ ACID được đưa ra để dễ dàng ghi nhớ các tính chất của giao dịch:
Tính nguyên t ử (Atomicity) Một giao dịch có nhiều thao tác khác biệt thì hoặc là toàn bộ các thao tác hoặc là không một thao tác nào được hoàn thành.
Tính nhất quán (Consistency) Một giao dịch hoặc là sẽ tạo
ra một trạng thái dữ liệu mới và hợp lệ, hoặc trong trường hợp có lỗi thì toàn bộ dữ liệu sẽ chuyển toàn về trạng thái
trước khi thực hiện giao dịch.
Tính tách biệt (Isolation) Một giao dịch đang thực hiện và
chưa được xác thực phải bảo đảm tách biệt khỏi các giao
dịch khác.
Tính bền vững (Durability) Dữ liệu được xác thực sẽ được
hệ thống lưu trữ sao cho ngay cả trong trường hợp hỏng hóc hoặc có lỗi hệ thống, dữ liệu vẫn đảm bảo trong trạng thái chính xác.
Ví dụ: Lịch sử của 1 giao dịch
Client mở thành công 1 giao dịch đến Server, và giao dịch này được cấp 1 định danh, định danh này sẽ được sử dụng
Trang 3Các hoạt động từ Client và Server ban đầu được thực hiện thành công
Khi 1 hoạt động trên Server bị lỗi, Server sẽ gửi thông báo cho Client
Khi đó Client sẽ Hủy bỏ giao dịch, và giao dịch kết thúc.
Một số Đặc điểm của giao dịch
- Nếu một máy chủ bị lỗi bất thường thì hành động cuối cùng cần được thay thế
- Bất kỳ giao dịch nào chưa được xác thực sẽ bị hủy bỏ
- Giao dịch nào được xác thực trong thời điểm gần nhất sẽ được sử dụng để khôi phục giá trị cho đối tượng
- Để đối phó với một client bị lỗi trong quá trình giao dịch, máy chủ sẽ cung cấp cho mỗi giao dịch, một khoảng thời gian nhất định và loại bỏ giao dịch nếu không hoàn thành trước thời gian đó.
- Nếu một máy chủ bị lỗi trong khi tiến hành giao dịch, client sẽ nhận được một hành động trả về sau khi hết thời gian chờ Nếu máy chủ bị lỗi, giao dịch sẽ không còn giá trị và khách hàng phải thực hiện một giao dịch tiếp theo.
Trang 42 Giao dịch lồng nhau
- Giao dịch lồng nhau là giao dịch được bao gồm một số giao dịch khác.
- Giao dịch ngoài cùng trong giao dịch lồng nhau được gọi là giao dịch level Các giao dịch khác nhỏ hơn giao dịch top-level gọi là giao dịch con
- Một giao dịch con có thể bị hủy bỏ một cách độc lập với giao dịch con khác
Ưu điểm của giao dịch lồng nhau:
- Các giao dịch con tại 1 mức có thể chạy đồng thời với các giao dịch con khác tại cùng mức trong cây phân cấp Điều này cho phép thêm vào giao dịch đồng thời Khi các giao dịch chạy trên các server khác nhau, chúng có thể làm việc song song
- Các giao dịch con có thể xác thực hoặc Hủy bỏ độc lập nhau.
So với một giao dịch đơn, tập hợp giao dịch con lồng nhau là mạnh mẽ hơn
V
í D ụ: gửi email cho một nhiều người cùng lúc, nếu email
nào không tồn tại (sai địa chỉ) thì chỉ có mail đó không đến đúng địa chỉ Nghĩa là một giao dịch thất bại không làm cho toàn bộ giao dịch bị khởi động lại.
Các quy tắc trong việc xác thực giao dịch lồng nhau:
• Một giao dịch có thể Xác thực hoặc Hủy bỏ chỉ sau khi giao dịch con của nó đã hoàn thành.
• Khi một giao dịch con hoàn thành, thì nó hoặc Xác thực tạm thời hoặc Hủy bỏ tạm thời.
• Khi giao dịch cha mẹ bị hủy bỏ, tất cả các giao dịch con cũng bị hủy bỏ
Ví Dụ, nếu T2 Hủy bỏ thì T21 và T211 cũng Hủy bỏ, ngay cả khi chúng đã Xác thực tạm thời.
• Nếu giao dịch top-level Xác thực, thì tất cả các giao dịch con
mà đã xác thực tạm thời có thể xác thực chính thức, miễn là không giao dịch bên ngoài của nó bị hủy bỏ
Trang 5Ví Dụ, Nếu T Xác thực cho phép T1, T11 và T12 Xác thực, nhưng T21 và T211 thì không bởi vì cha mẹ chúng là T2 bị Hủy bỏ.
• Trong nhiều trường hợp, giao dịch top-level có thể quyết định Hủy bỏ bởi vì một hoặc nhiều giao dịch con của nó bị Hủy bỏ
V
í D ụ : Chuyển 100$ từ B tới A:
1 Cộng vào A $100
2 Trừ $100 từ B
Điều này có thể cấu trúc như một cặp giao dịch, một cho giao dịch Cộng tiền và một cho giao dịch trừ tiền giữa hai tài khoản
Khi cả 2 giao dịch con được xác thực, giao dịch cha có thể được xác thực Giả sử giao dịch con Trừ tiền B bị Hủy, Giao dịch công tiền được xác thực: gọi lại xác thực của giao dịch con là điều kiện cho cha mẹ xác thực.
Giả sử rằng giao dịch top-level sẽ quyết định Hủy bỏ Việc Hủy bỏ của cha mẹ gây ra các giao dịch con Hủy bỏ do vậy giao dịch Cộng tiền bị Hủy bỏ và tất cả những việc nó đã làm
bị undo.
Trang 63 Kiểm soát truy cập đồng thời
The Lost update problem (Vấn đề mất dữ liệu cập nhật):
- Tình trạng này xảy ra khi có nhiều hơn một giao dịch cùng thực hiện cập nhật trên 1 đơn vị dữ liệu Khi đó, kết quả của thao tác cập nhật thực hiện sau sẽ đè lên kết quả của thao tác cập nhật trước đó.
Tài khoản A, B, C có số dư tương ứng là $100, $200, $300
Giao dịch T (A => B) Giao dịch U (C => B)
Xem số dư ở tài
Tăng số dư của B
thêm 10% lấy từ A $200*10 %
= $220 Trừ Tài khoản A số
tiền đã chuyển vào B
– Còn lại
$80 Xem số dư ở tài
Tăng số dư của B
= $242
Trừ Tài khoản C số
tiền đã chuyển vào B – Còn lại
$278
Khi 2 giao dịch thực hiện đồng thời:
Trang 7Như vậy, tài khoản B được cập nhật 2 lần, có số dư là $220 thay vì giá trị đúng phải là $242
Số dư của tài khoản C là $288 thay vì giá trị đúng là $278
Inconsistent retrievals (Truy vấn không phù hợp):
Đây là tình huống một hoạt động truy vấn và hoạt động cập nhật
xử lý đồng thời, khiến giao dịch truy cập nhiều lần trên cùng 1 dữ liệu cho ra nhiều giá trị khác nhau.
2 tài khoản A,B ban đầu có số dư là $200,
Sau hoạt động trừ $100 từ tài khoản A, Hoạt động tính tổng số dư của 2 tài khoản là $100+$200=$300 =>điều này là không chính xác.
Hoạt động tiếp theo cộng vào tài khoản B $100, khi đó B có $300.
Trang 8Nghĩa là, giao dịch W thực hiện truy vấn trong khi giao dịch V thực hiện chuyển 1 số tiền từ tài khoản A sang B nhưng chưa hoàn thành.
Serial equivalence (tuần tự) :
Đây là cách khắc phục 2 tình huống Mất dữ liệu cập nhật và Truy vấn không phù hợp Khi 2 hoạt động không bị xung đột
thì cho phép thực hiện đồng thời Còn ngược lại, phải thực hiện tuần tự Xong giao dịch 1 thì giao dịch 2 mới được thực hiện.
4 Khóa
- Giao dịch phải được lên kế hoạch để tác động lên các dữ liệu được chia sẻ một cách tuần tự
- Một cơ chế đơn giản là việc sử dụng khóa
- Máy chủ sẽ khóa bất kỳ đối tượng được sử dụng trong hoạt động giao dịch của client
- Nếu một client khác yêu cầu quyền truy cập vào một đối tượng đã bị khóa thì yêu cầu sẽ bị treo và nó phải chờ đến khi đối tượng được mở khóa
- Một máy chủ thường có chứa một số lượng lớn các đối tượng, và một giao dịch điển hình chỉ truy cập một vài trong số chúng và gần như không xung đột với các giao dịch vãng lai khác
- Phạm vi cho truy cập đồng thời đến các đối tượng sẽ bị hạn chế nghiêm trọng nếu khóa được áp dụng cho tất cả các đối tượng cùng một lúc
- Một cách thích hợp hơn là sử dụng khóa để có thể có nhiều giao dịch đồng thời đọc một đối tượng, hoặc một giao dịch duy nhất ghi một đối tượng
Trang 9- Khóa đọc –ghi: cho phép nhiều hơn 1 giao dịch có thể giữ khóa trên mục dữ liệu,
có 2 thao tác ( read –lock, write –lock)
- Khóa treo
a Quy tắc xung đột hoạt động:
1 Nếu giao dịch T đang đọc 1 đối tượng thì 1 giao dịch đồng thời U không được ghi lên đối tượng đó đến khi T được xác nhận hoặc hủy bỏ
2 Nếu 1 giao dịch T đang thực hiện ghi một đối tượng thì 1 giao dịch đồng thời U không được đọc hay ghi cho đến khi T được xác nhận và hủy bỏ Hình dưới đây là ví dụ về xung đột hoạt động: cho 1 đối tượng với các khóa đã được thiết lập:
thời khác có thể đọc hoặc ghi
được đọc không được ghi
thể đọc hoặc ghi đối tượng
- Giải quyết vấn đề inconsistent retrieval: Nếu giao dịch đọc đến trước, nó sẽ trì hoãn giao dịch ghi
- Giải quyết vấn đề lost update: Mất cập nhật xảy ra khi hai giao dịch đọc một giá trị của một đối tượng và sau đó sử dụng nó để tính toán một giá trị mới Mất cập nhật được ngăn ngừa bằng cách làm cho các giao dịch sau đó trì hoãn lần đọc cho đến khi những giao dịch trước đó hoàn thành Điều này đạt được bởi mỗi giao dịch thiết lập một khóa đọc khi nó đọc một đối tượng và sau đó thăng cấpnó thành một khóa viết khi nó viết cùng một đối tượng - khi một giao dịch tiếp theo yêu cầu một đọc khóa nó sẽ bị trì hoãn cho đến khi nào giao dịch hiện tại hoàn thành
Quy sử dụng Khóa : trong khóa hai pha nghiêm ngặt
1) Khi một hành động truy cập một đối tượng trong một giao dịch:
a) Nếu đối tượng không bị khóa, thì nó sẽ bị khoá và thực thi hành động.
b) Nếu đối tượng có một khóa xung độtvới một giao dịch khác, giao dịch sẽ phải chờ đợi cho đến khi nó được mở khóa
Trang 10c) Nếu đối tượng có một khóa không xung đột với một giao dịch khác, khóa được chia sẻ và thực thi hành động.
d) Nếu đối tượng đã bị khóa trong cùng một giao dịch, khóa sẽ được nâng cấp nếu cần thiết và thực thi hành động (Trong trường hợp nâng cấp
bị ngăn chặn bởi một khóa xung đột, quy tắc b được sử dụng.)
2) Khi một giao dịch thành công hoặc hủy bỏ, máy chủ sẽ mở khóa tất cả các đối tượng nó bị khóa
Quy tắc sử dụng khóa cho các giao dịch lồng nhau
Sử dụng khóa để các giao dịch con được truy cập một cách tuần tự:
1) Mỗi tập hợp các giao dịch lồng nhau phải ngăn chặn tác độngcủa tập hợp các giao dịch lồng nhau khác
2) Mỗi giao dịch trong một tập hợp các giao dịch lồng nhau phải ngăn chặn tác động của các giao dịch khác trong tập hợp này
một giao dịch con thành công, được kế thừa bởi cha mẹ của nó khi nó hoàn thành
- Lưu ý rằng hình thức này kế thừa được truyền từ con đến mẹ
- Các giao dịch ngoài cùng được kế thừa tất cả các khóa đã được mua lại bởi các giao dịch con thành công
- Điều này đảm bảo rằng các khóa có thể được giữ cho đến khi giao dịch ngoài cùng đã cam kết hoặc hủy bỏ, do đó ngăn chặn thành viên của giao dịch lồng nhau khác
- Giao dịch mẹ không được phép chạy đồng thời với các giao dịch con của mình Nếu một giao dịch mẹ có khóa trên một đối tượng, nó vẫn giữ được khóa trong thời gian giao dịch mà con của nó được thực hiện Điều này có nghĩa rằng các giao dịch con tạm thời mua lại các khóa từ cha mẹ của nó
- Các giao dịch con cùng cấp được phép chạy đồng thời, nên khi chúng truy cập vào cùng một đối tượng, chương trình khóa phải theo tuần tự truy cập của chúng
4.1 Deadlocks
- Việc sử dụng Khóa có thể dẫn tới Deadlocks
- Là trạng thái mà trong đó mỗi hoạt động của một nhóm giao dịch đang chờ đợi để một số hoạt động khác phát hành khóa Một đồ thị wait - for có thể được sử dụng
để đại diện cho mối quan hệ giữa các giao dịch Một nút tương ứng với 1 giao dịch hoạt động
Trang 11a.deposit(100); write lock A: Gửi tiền vào A, cấp Khóa cho A
b.withdraw(100) : Rút tiền từ B
dịch U được mở
khóa A trong giao dịch T được mở
Phòng chống Deadlocks
- Một cách đơn giản nhưng không phải là cách tốt nhất, đó là khóa tất cả các đối tượng sử dụng bởi một giao dịch khi nó bắt đầu
- Tuy nhiên, Phương pháp này sẽ làm hạn chế quyền truy cập vào tài nguyên sử
dụng chung Ngoài ra, điều đó đôi khi không thể dự đoán vào lúc bắt đầu giao dịch mà các đối tượng sẽ được sử dụng Điều này thường là trường hợp trong các ứng dụng tương tác, cho người sử dụng sẽ phải nói trước một cách chính xác những đối tượng mà họ đang lên kế hoạch sử dụng
- Deadlocks cũng có thể được ngăn ngừa bằng cách yêu cầu khóa trên các đối tượng
trong một trật tự được xác định trước, nhưng điều này có thể dẫn đến khóa sớm và làm giảm sự đồng thời
- Các thuật toán WAIT-DIE và WOUND- DIE được thiết kế dựa trên gán nhãn thời
gian cho giao dịch
- Là thuật toán không tước quyền
thì nó không bao giờ tước
- Là thuật toán tước quyền được khẳng định theo quy tắc sau:
chỉ được phép chờ khi và chỉ
Trang 12- Quy tắc như sau: Nếu Ti yêu cầu
khóa trên mục dữ liệu đã được
khởi động lại với nhãn thời gian
cũ
- Nâng cấp khóa Deadlocks thường được gây ra bởi hai giao dịch xung đột đầu tiên
tham gia khóa đọc và sau đó cố gắng thúc đẩy nó để có khóa ghi Một giao dịch với một khóa nâng cấp trên một mục dữ liệu được phép đọc, nhưng khóa này xung đột với ổ khóa nâng cấp được thiết lập bởi các giao dịch khác trên mục dữ liệu tương tự Đây là loại khóa không thể thiết lập ngầm bằng việc sử dụng một hoạt động đọc, nhưng phải được theo yêu cầu của khách hàng
Phát hiện Deadlocks
wait-for Sau khi phát hiện một bế tắc, một giao dịch phải bị hủy bỏ để phá vỡ chu trình
- Giao dịch T đợi chờ giao dịch
U, V
- Giao dịch V đợi chờ giao dịch
W
Để phá bỏ Deadlock: sau khi phát hiện 1
Deadlock, phải phá bỏ 1 giao dịch để phá vỡ chu trình
- Bây giờ xem xét 1 kịch bản: trong 3
Trang 13 tạo ra chu trình và các giao
dịch xảy ra đồng thời
trên 1 đối tượng C và giao dịch W chứa 1 khóa ghi trên đối tượng B, mà giao dịch V chờ đợi để có được 1 khóa
- Các giao dịch T và W sau đó yêu cầu ghi ổ khóa trên đối tượng C và tình huống bế tắc phát sinh trong đó T đợi
U và V, V đợi chờ W, và chờ đợi W cho T, U, V như hình bên trái
Điều này cho thấy mặc dù mỗi giao dịch
có thể đợi chờ cỉ có 1 đối tượng tại 1 thời gian, nó có thể tham gia vào nhiều chu trình
Ví dụ giao dịch V tham gia vào 2 chu trình: V
WT và VWT
Trong ví dụ này, giả sử vòng giao dịch V bị phá bỏ điều này phát hành khóa V về C và
2 chu trình liên quan V bị phá vỡ
Timeouts
- Khóa timeout là một phương pháp để giải quyết bế tắc thường được sử dụng
- Mỗi khóa được cho một khoảng thời gian nhất định Sau thời gian này, một khóa
có thể bị tổn thương Tuy nhiên, nếu bất kỳ giao dịch nào khác đang phải chờ đợi
để truy cập đối tượng này, thì khóa bị tổn thương đó sẽ bị hỏng (có nghĩa là, đối tượng sẽ được mở khóa) và giao dịch đang chờ đợi được tiếp tục Các giao dịch
mà khóa đã bị phá vỡ thường bị hủy bỏ