Thuật toỏn khúa chố t2 pha (2PL)

Một phần của tài liệu Giáo trình cơ sở dữ liệu phân tán TS phạm thế quế, TS hoàng minh (Trang 46 - 57)

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}

Một phần của tài liệu Giáo trình cơ sở dữ liệu phân tán TS phạm thế quế, TS hoàng minh (Trang 46 - 57)