Thuật toỏn khúa chốt 2 pha (Two Phase Locking - 2PL) giải quyết triệt để những nhược điểm vềđiều khiển đồng thời cỏc giao dịch trong thuật toỏn khúa chốt. Dễ dàng mở rộng cho mụi trường phõn tỏn, bằng cỏch trao trỏch nhiệm quản lý khoỏ cho một vị trớ duy nhất, nghĩa là chỉ cú một vị trớ là cú bộ quản lý khoỏ. Cỏc bộ quản lý giao dịch ở cỏc vị trớ khỏc nhau phải giao tiếp với bộ quản lý khoỏ. Cỏch tiếp cận này được gọi là thuật toỏn 2PL - vị trớ chớnh (primary site).
Thuật toỏn khúa chốt 2 pha (2PL) khẳng định rằng khụng cú giao dịch nào yờu cầu khúa sau khi nú đó giải phúng một trong cỏc khúa của nú. Nghĩa là một giao dịch khụng giải phúng khúa cho đến khi nú khụng yờu cầu thờm khúa. Cỏc giao dịch trong cỏc thuật toỏn 2PL thực hiện hai pha, trong pha tăng trưởng nú nhận cỏc khúa và truy cập cỏc mục dữ liệu và pha thu hồi, nú giải phúng cỏc khúa. Điểm khúa (Lock Point) là điểm giao dịch đó nhận được tất cả cỏc khúa nhưng chưa bắt đầu giải phúng bất kỳ khúa nào. Vỡ thếđiểm khúa được xỏc định cuối pha tăng trưởng và khởi đầu pha thu hồi của một giao dịch.
Tất cả cỏc lịch biểu tạo bởi thuật toỏn điều khiển đồng thời tuõn theo quy tắc 2PL là khả tuần tự.
Hỡnh 4.8: Biểu đồ khúa chốt hai pha nghiờm ngặt
Thuật toỏn khúa chốt 2 pha làm tăng hoạt động đồng thời, bộ quản lý khúa cho phộp cỏc giao dịch đợi khúa tiếp tục truy cập mục dữ liệu và nhận khúa. Tuy nhiờn bộ quản lý khúa khụng biết giao dịch đó nhận đủ khúa và cũn truy cập mục dữ liệu hay khụng. Nếu giao dịch bị hủy bỏ sau khi giải phúng một khúa, nú cú thể làm hủy bỏ luụn cả cỏc giao dịch đó truy cập cỏc mục đó mở khúa.
Thuật toỏn khúa chốt hai pha nghiờm ngặt (Strict Two Phase Locking), thực hiện giải phúng tất cả khúa vào lỳc giao dịch kết thỳc. Bảo đảm cỏc khúa chỉ được giải phúng nếu thao tỏc là Commit hay Abort.
Thuật toỏn khúa chốt hai pha nghiờm ngặt S2PL-LM
Declare-var: msg: Message, dop: Dbop, Op: Operation, x: DataItem, T: TransactionId, pm: Dpmsg, res: Data Val, SOP: OpSet
begin repeat
case of msg Dbop: begin Op ← dop.opn x ← dop.data T ← dop.tid case of Op Begin_Transaction: begin gửi dop đến bộ xử lý dữ liệu end
Read or Write: {yờu cầu khúa} begin
tỡm đơn vị khúa lu sao cho x ⊆ lu
if lu chưa bị khúa or chếđộ khúa của lu tương thớch với
Op then begin đặt khúa trờn luở chếđộ thớch hợp gửi dopđến bộ xử lý dữ liệu end else
đưa dop vào một hàng đợi của lu
end-if end Abort or Commit: begin gửi dop đến bộ xử lý dữ liệu end end-case
Dpmsg:
begin
Op ← pm.opn Res ← pm.result T ← pm.tid
if Op = Abort or Op = Commit then begin
for mỗi đơn vị khúa lu bị khúa bởi T do begin
giải phúng khúa trờn lu do T giữ
if khụng cũn khúa nào trờn lu and cú cỏc thao tỏc đang đợi trong hàng đợi cho lu then
begin
SOP ← thao tỏc đầu tiờn trong hàng đợi
SOP ← SOP ∪ {O⎢O là một thao tỏc trờn hàng đợi cú thể khúa lu ở chếđộ khúa tương thớch với cỏc thao tỏc hiện hành trong SOP}
đặt cỏc khúa trờn lu cho cỏc thao tỏc trong SOP for tất cả cỏc phộp toỏn trong SOP do
gửi mỗi thao tỏc đến bộ xử lý dữ liệu end-for end-if end-for end-if end end-case until forever end. {S2PL-LM}
Thuật toỏn: Bộ quản lý khúa giao dịch 2PL (2PL-TM)
Declare-var: msg: Message, dop: Dbop, Op: Operation, x: DataItem, T: TransactionId, pm: Dpmsg, res: Data Val, SOP: OpSet
begin repeat WAIT(msg) case of msg Dbop: begin Op ← dop.opn x ← dop.data T ← dop.tid case of Op Read: begin
trả res về cho ứng dụng của người dựng (nghĩa là giao dịch)
end
Write: {yờu cầu khúa} begin
thụng tin cho ứng dụng về việc hoàn tất hành động ghi trả res về cho ứng dụng
end Commit: begin
hủy vựng làm việc của T
thụng tin cho ứng dụng biết về việc hoàn thành giao dịch T
end Abort: begin
thụng tin cho ứng dụng biết về việc đó hủy bỏ giao dịch T
end end-case until forever end. {2PL-TM}.
4.6.3 Thuật toỏn quản lý giao dịch 2PL tập trung (C2PL TM)
Một vị trớ duy nhất trờn mạng mỏy tớnh (vị trớ trung tõm) được cài đặt bộ quản lý khúa. Cỏc bộ quản lý giao dịch ở cỏc vị trớ khỏc phải giao tiếp với vị trớ chớnh. Phương phỏp giao tiếp này được gọi là thuật toỏn quản lý giao dịch 2PL tập trung cho cỏc giao dịch đồng thời phõn tỏn.
Khi thực hiện một giao dịch, bộ quản lý giao dịch của vị trớ TM điều phối - nơi khởi đầu giao dịch yờu cầu vị trớ LM trung tõm trao khúa cho nú. Khi đó được trao khúa, nú yờu cầu cỏc vị trớ chứa cỏc bộ xử lý dữ liệu khỏc tham gia giao dịch. Kết thỳc giao dịch, TM điều phối sẽ giải phúng khúa.
1. TM điều phối - khởi đầu giao dịch yờu cầu LM cung cấp khúa. 2. LM trung tõm trao khúa cho TM điều phối.
3. TM điều phối yờu cầu cỏc bộ xử lý dữ liệu tại cỏc vị trớ tham gia giao dịch.
4. Sau khi hoàn tất cỏc thao tỏc giao dịch, TM điều phối giải phúng khúa, trao quyền điều khiển cung cấp khúa cho LM trung tõm.
Thuật toỏn C2PL-TM phõn tỏn khỏc với thuật toỏn TM tập trung là sự cài đặt giao thức điều khiển bản sao nếu cơ sở dữ liệu được nhõn bản. Nú cũng khỏc với thuật toỏn bộ quản lý khúa 2PL nghiờm ngặt là bộ quản lý khúa trung tõm khụng gửi cỏc thao tỏc đến cỏc bộ xử lý dữ liệu tương ứng mà do LM điều phối thực hiện.
Thuật toỏn 4.4: Quản lý giao dịch 2PL tập trung (C2PL-TM)
Declare-var: msg: Message, dop: Dbop, Op: Operation, x: DataItem, T: TransactionId, pm: Dpmsg, res: Data Val, SOP: OpSet
begin repeat WAIT(msg) case of msg Dbop: begin Op ← O.opn x ← O.data T ← O.tid case of Op Begin_Transaction: begin S ← ∅ end Read:
begin
S ← S ∪{trạm lưu x và cú chi phớ truy cập đến x là nhỏ nhất}
gửi O cho bộ quản lý khúa trung tõm end
Write: begin
S ← S ∪ {Si ⏐x được lưu tại Si} gửi O cho bộ quản lý khúa trung tõm end
Abort or Commit: begin
gửi O cho bộ quản lý khúa trung tõm end
end-case
Scmsg: {yờu cầu khúa được trao khi cỏc khúa được giải phúng} begin
if yờu cầu khúa được trao then
gửi O cho cỏc bộ xử lý trong S else
thụng tin cho người dựng biết về việc kết thỳc giao dịch end-if end Dpmsg: begin Op ← pm.opn res ← pm.result
T ← pm.tid case of Op Read: begin
trả res về cho ứng dụng người dựng (nghĩa là giao dịch) end
Write: begin
thụng tin cho ứng dụng biết về việc hoàn tất thao tỏc ghi
end Commit: begin
if tất cả cỏc thành viờn đều nhận được thụng bỏo commit then
begin
thụng tin cho ứng dụng biết về việc hoàn thành giao dịch
gửi pm cho bộ quản lý khúa trung tõm end
else {đợi cho đến khi tất cảđều nhận được thụng bỏo commit}
ghi nhận sự kiện thụng bỏo commit đến tất cả cỏc trạm end-if
end Abort: begin
thụng tin cho ứng dụng biết về việc hủy bỏ giao dịch T gửi pm đến bộ quản lý khúa trung tõm
end-case end
end-case until forever end. {C2PL-TM}
Thuật toỏn quản lý khúa 2PL tập trung (C2PL-LM)
Declare-var: msg: Message, dop: Dbop, Op: Operation, x: DataItem, T: TransactionId, pm: Dpmsg, res: Data Val, SOP: OpSet
begin repeat WAIT(msg) Op ← dop.opn x ← dop.data T ← dop.tid case of Op Read or Write: begin
tỡm đơn vị khúa lu sao cho x ⊆ lu
if lu chưa khúa or chế độ khúa của lu tương thớch với Op then
begin
đặt khúa trờn lu ở chếđộ thớch hợp
msg ← “Khúa được trao cho thao tỏc dop” gửi msg đến TM điều phối của T
else đặt Op vào một hàng đợi cho lu end-if end Abort or Commit: begin
for mỗi đơn vị khúa lu bị khúa bởi T do begin
giải phúng khúa trờn lu do T giữ
if cũn những thao tỏc đang đợi lu trong hàng đợi then begin
SOP ← thao tỏc đầu tiờn (gọi O) từ hàng đợi SOP ← SOP ∪ {O⎢O là một thao tỏc trờn hàng
đợi cú thể khúa lu ở chếđộ tương thớch với cỏc thao tỏc trong SOP}
đặt cỏc khúa trờn lu cho cỏc thao tỏc trờn SOP for tất cả cỏc phộp toỏn trong SOP do
begin
msg ← “Khúa được trao cho thao tỏc dop” gửi msg đến tất cả cỏc TM điều phối end-for end-if end-for msg ← “Cỏc khúa của Tđó giải phúng” gửi msg đến TM điều phối của T end end-case until forever end. {C2PL-LM}