Tải bản đầy đủ (.doc) (29 trang)

Bao cao de tai

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (500.05 KB, 29 trang )

LỜI MỞ ĐẦU


Sự phát triển nhanh chóng của hệ thống Viễn thông – Công Nghệ Thông tin trong
giai đoạn hiện nay đã đóng góp rất nhiều vào q trình phát triển xã hội, làm cho cuộc
sống của con người ngày càng tiện nghi, đầy đủ hơn. Tuy nhiên với yêu cầu ngày càng
cao trong cơng việc và cuộc sống thì có một số vấn đề mà hệ thống tin học tập trung hiện
tại đã không thể giải quyết được. Từ đó, hệ tin học phân tán với các ưu điểm của mình đã
và đang trở thành một phương pháp hiệu quả để giải quyết các vấn đề cấp thiết hiện nay.
Tuy nhiên, để giải quyết về vấn đề gắn bó dữ liệu và cung cấp tài nguyên trong hệ
phân tán là một vấn đề phức tạp. Vấn đề quan trọng là chiến lược khai thác và sử dụng các
tài nguyên dùng chung như thế nào ?
Trong phạm vi của bài tiểu luận này, với những kiến thức mà tôi đã được học, đọc
cũng như tự tìm hiểu thêm từ sách báo và mạng Internet, tơi xin trình bày ba nội dung
theo trình tự như sau:
Phần I: Điều khiển đồng thời bằng cơ chế then cài
Phần II: Bài toán sử dụng bộ quản lý khoá cơ bản và những điểm cần cải tiến.
Phần III: Phần mềm mô tả hoạt động cơ chế then cài ( bằng ngôn ngữ JAVA).
Với một lĩnh vực còn mới mẻ, đa dạng và phức tạp như trên vì vậy việc tìm hiểu của
tơi cịn nhiều hạn chế. Kính mong nhận được sự góp ý, định hướng của Thầy giáo Lê Văn
Sơn và các bạn cùng lớp để tơi có thể tiếp tục nghiên cứu và đạt được kết quả tốt hơn
trong thời gian tới.
Xin chân thành cảm ơn !


Tiểu luận môn Hệ tin học phân tán
CHƯƠNG I :
ĐIỀU KHIỂN ĐỒNG THỜI BẰNG CƠ CHẾ THEN CÀI
1. Tổng quan:
Một cách đơn giản, chúng ta hình dung vấn đề sau để có thể hiểu được về
cơ chế then cài trong việc Điều khiển đồng thời:


Giả sử có 2 phần mềm cùng cần đọc hay ghi một tập tin f được lưu trên đĩa
C và nhiệm vụ của mỗi phần mềm như sau:
- Phần mềm 1 ghi chữ “HELLO”.
- Phần mềm 2 ghi chữ “WORLD”.
Mục đích cuối cùng của chúng ta là ghi ra chữ “HELLO WORLD” trong tệp tin f.
Giả sử rằng chúng ta chưa có một cơ chế điều khiển để các phần mềm thực hiện việc
truy cập tập tin f thì kết quả có thể có trong tập tin f như:
WORLD HELLO ( trật tự bị đảo ngược )
HE WORLD LLO ( thứ tự không theo trật tự)
…. Và nhiều kết quả khác.
Như vậy mục tiêu của 2 phần mềm sẽ không đáp ứng được yêu cầu.
Do vậy, nói rộng ra trong hệ phân tán, để đạt được kết quả đúng, chúng ta
cần sử dụng một cơ chế đề điều khiển việc truy cập đồng thời vào một tài nguyên nhất
định. Qua nhiều nghiên cứu, thuật toán điều khiển đồng thời được sử dụng rộng rãi
nhất là then cài. Trong ví dụ trên, khi một tiến trình cần đọc hay ghi một tập tin thì
trước tiên nó phải khố (cài then) tập tin đó. Then cài có thể được dùng như một bộ
quản lý khoá tập trung, hay với một bộ quản lý khoá cục bộ trên từng máy để quản lý
các tập tin cục bộ. Trong cả hai trường hợp, bộ quản lý khoá bao gồm một danh sách
các tập tin bị khoá, và từ chối tất cả mọi cố gắng cài then tập tin mà tập tin đó đã thật
sự bị khố bởi một tiến trình khác. Khoá được sinh ra và được giải thoát một cách tự
động bởi hệ thống các giao tác, không phụ thuộc vào hành động của lập trình viên.
2. Cơ chế then cài:

Một giao dịch nào đó đang thực hiện phép then cài trên một đối tượng
muốn dành quyền sử dụng đối tượng này theo một vài kiểu truy cập nhất định. Cơ chế
then cài gán hay không gán quyền truy cập này căn cứ vào qui tắc tiền định như loại trừ
tương hỗ, luật đọc – hiệu chỉnh thông tin…

Nếu quyền được thừa nhận thì đối tượng bị cài then bởi giao dịch. Nếu
khơng, tiến trình thực hiện giao dịch bị khóa và đối tượng khơng bị cài then.


Cơ chế then cài cho phép một giao dịch có thể giải phóng đối tượng mà nó
đã cài then.
a. Loại trừ tương hỗ:

Một trong những giải pháp đơn giản để đạt được trật tự hố gắn bó thể hiện
ở chổ bắt buộc phải sử dụng trật tự hoá tuần tự. Để làm việc đó, tồn bộ giao dịch được
đặt trong cặp hàm nguyên thuỷ mo_giaodich và dong_giaodich. Đây là sự đảm bảo cho
việc loại trừ tương hỗ giữa các giao dịch.

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25

2


Tiểu luận môn Hệ tin học phân tán

Nếu ta biết trước các đối tượng được xử lý bởi một giao dịch nào đó, thì ta
có thể cài then cơng việc truy cập đến các đối tượng. Điều đó chỉ cho phép thực hiện
song song đối với các giao dịch truy cập vào các đối tượng rời rạc.

Nếu ta muốn nâng cao hơn nữa khả năng sử dụng song song, thì cần phải
thực hiện cài then ở mức độ thấp hơn mức giao dịch.
b. Then cài chọn lựa các đối tượng:

Các quy tắc truy cập đối tượng được chú ý. Đó là tính hợp thức của việc
truy cập. Nội dung của quy tắc này như sau: “Một giao dịch thay đổi giá trị của đối
tượng phải loại trừ tất cả các đối tượng khác muốn truy cập, ngược lại thì việc truy cập
được tiến hành theo kiểu tương tranh”.


Để đảm bảo điều đó ln ln được thực hiện, người ta cho phép tiến hành
cài then một đối tượng trước khi việc sử dụng nó có hiệu lực.

Một giao dịch có thể thực hiện ba hàm nguyên thuỷ trên đối tượng e:
STT
1
2

Tên hàm
v_doc(e)
v_viet(e)

3

giai_phong(e)

Thuyết minh
Sử dụng khi muốn có được quyền đọc e theo kiểu chia sẽ.
Sử dụng khi muốn có được quyền đọc và viết vào e theo kiểu
loại trừ.
Giải phóng đối tượng e. Giả sử trước đó đã được cài then bởi
cùng giao dịch này.



Một giao dịch gọi là phát triển nếu:
 Một phép toán chỉ được thực hiện trên một đối tượng sau khi đối tượng đó đã
được cài then bởi giao dịch theo kiểu tương thích với phép tốn.
 Khơng có giao dịch nào cài then được trên đối tượng mà trước đó đã bị cài
then cũng bởi chính giao dịch đó, ngoại trừ theo kiểu loại trừ trong trường hợp

trước đó đã sử dụng kiểu chia sẽ.
 Sau khi chấm dứt một giao dịch, khơng có đối tượng nào bị cài then.

Các then cài được sử dụng để hạn chế một lớp các trật tự hố có khả năng
được thực hiện. Một trật tự hoá được gọi là hợp thức nếu:
 Đối tượng được một giao dịch cài then theo kiểu chia sẽ không bị bất cứ then
cài nào theo kiểu loại trừ của các giao dịch khác.
 Một đối tượng bị cài then theo kiểu loại trừ thì khơng bị bất kỳ then cài mới
nào nữa.

Do vậy, mọi cố gắng cài then không phù hợp với các điều kiện tương hỗ
nêu trên đều phải chờ (bị làm chậm lại) cho đến khi mở then.

Chú ý: Một giao dịch được gọi là tốt, nếu nó sử dụng các then cài phù hợp
với đặc điểm của chúng. Một trật tự hoá được gọi là hợp thức, nếu các then cài hoạt động
phù hợp với các đặc điểm này.
c. Giao dịch 2 pha:

Xem xét một giao dịch hình thành hợp thức bằng cách kiểm tra hai điều
kiện:
 Toàn bộ đối tượng bị cài then vẫn ở trong tình trạng cài then cho đến cuối giao
dịch.

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25

3


Tiểu luận mơn Hệ tin học phân tán
 Khơng có then cài nào có thể diễn ra tiếp theo một then cài khác trong cùng

một giao dịch.
o Điều kiện này thể hiện ở chỗ là dãy các phép toán trên các then cài được
phân tích thành hai pha nối tiếp nhau. Một pha mà trong đó các đối tượng
bị cài then, cịn pha kia chúng được mở then.
o Tồn bộ trật tự hoá hợp thức của một tập hợp các giao dịch hình thành tốt
hai pha là gắn bó, có nghĩa là cùng hiệu ứng với trật tự hoá tuần tự.
o Ngược lại, nếu các giao dịch của một tập hợp khơng phải là hình thành tốt
và ở hai pha thì có thể xây dựng các trật tự hố hợp thức của M là khơng
gắn bó.

Để hiểu rõ hơn, ta xem xét các ví dụ sau.
 Ví dụ 1:
Hãy truy cập vào tập hợp các đối tượng.
Giả sử rằng ta muốn đọc các giá trị của một tập hợp các đối tượng và quy ước rằng
các giá trị này kiểm tra các ràng buộc toàn vẹn. Lúc này, ta cần phải cài then theo kiểu
chia sẽ cho mỗi một đối tượng trước khi đọc, mở then diễn ra ở cuối của giao dịch này.
Một phép như vậy gọi là đọc gắn bó của tập hợp các đối tượng.
Như thế, giao dịch được thể hiện như sau:
v_doc(a)
v_doc(b)
doc(a)
doc(b)
v_doc(c)
doc(c)
giai_phong(a)
giai_phong(b)
giai_phong(c)
là giao dịch đọc gắn bó của tập hợp {a,b,c}.
 Ví dụ 2: Quản lý các tài khoản trong một ngân hàng.
Mỗi một người mở tài khoản tại ngân hàng sẽ được lưu trữ trong một bản ghi của

cở sở dữ liệu. Các trường của bản ghi này bao gồm họ và tên, địa chỉ, điện thoại và một
khoá duy nhất (mã số) cho người đó. Mã số đóng vai trị con trỏ đến cơ sở dữ liệu khác
chứa các lần thu tiền vào và rút tiền ra từ tài khoản. Cuối cùng, chúng ta phải có cơ sở dữ
liệu chứa số dư. Số dư là số tiền có trong tài khoản ở thời điểm xem xét của từng người
gửi tiền. Trạng thái của số dư trong tài khoản được khống chế ở mức xác định, ví dụ như
số dư khơng được ≤ N cho trước. Điều đó cũng đồng nghĩa với việc đảm bảo trong tài
khoản của người sủ dụng khơng bao giờ có giá trị bằng 0 hay giá trị âm.
Bây giờ chúng ta hãy nghiên cứu vấn đề quản lý truy cập thơng tin tài khoản cho
phép đảm bảo được tính gắn bó.
Sau đây là hai kiểu mơ tả khác nhau của giao dịch T và một kiểu mơ tả có thể của
giao dịch U:
Giao dịch T1
v_viet(A)

Giao dịch T2
v_viet(A)

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25

Giao dịch U
v_viet(A)

4


Tiểu luận môn Hệ tin học phân tán
A:= A - P1
giai_phong(A)
v_viet(B)
B:= B + P1

giai_phong(B)

A:= A – P2
v_viet(B)
giai_phong(A)
B:= B + P2
giai_phong(B)

A:= (1+t)*A
v_viet(B)
B:= (1+t)*B
giai_phong(B)
giai_phong(A)

Ta kiểm tra rằng tất cả các giao dịch đều là hình thành tốt và T2 và U đều ở hai pha
và T1 khơng có hai pha.
Sau đây là hai trật tự hoá hợp thức S 1 và S2 xuất phát từ việc thực hiện song song
của T1 và U và T2 và U2.
S1(T1,U)
T11: v_viet(A)
T12: A:= A – P1
T13: giai_phong(A)
U1: v_viet(A)
U2: A:= (1+t)*A
U3: v_viet(B)
U4: B:= (1+t)*B
U5: giai_phong(B)
T14: v_viet(B)
T15: B:= B + P1
U6: giai_phong(A)

T16: giai_phong(B)

S2(T2,U)
T21: v_viet(A)
T22: A:= A – P2
T23: v_viet(B)
T24: giai_phong(A)
U1: v_viet(A)
U2: A:= (1+t)*A
T25: B:= B + P2
T26: giai_phong(B)
U3: v_viet(B)
U4: B:= (1+t)*B
U5: giai_phong(B)
U6: giai_phong(A)

Như vậy, ta kiểm tra rằng S1 dẫn đến trạng thái khơng gắn bó, U thực hiện trên các
giá trị khơng gắn bó của B và rằng S2 là tương đương với trật tự hoá tuần tự S2(T2,U).

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25

5


Tiểu luận môn Hệ tin học phân tán
CHƯƠNG II:
SỬ DỤNG BỘ QUẢN LÝ KHÓA CƠ BẢN VÀ NHỮNG ĐIỂM CẦN CẢI
TIẾN
Như đã nói ở phần trên, điều khiển đồng thời giải quyết các tính chất biệt lập và
nhất quán của giao dịch. Cơ chế điều khiển đồng thời phân tán của một hệ quản trị cơ

sở dữ liệu phân tán bảo đảm rằng tính nhất quán của cơ sở dữ liệu sẽ được duy trì
trong mơi trường phân tán nhiều người dùng. Nếu các giao dịch đã nhất quán nội tại
(nghĩa là không vi phạm bất kỳ ràng buộc nhất qn nào), thế thì để có thể đạt được
mục tiêu này, cách đơn giản nhất là thực hiện lần lượt từng giao dịch một. Rõ ràng một
chọn lựa như thế chỉ đáng chú ý về mặt lý thuyết và không được cài đặt trong bất kỳ
một hệ thống thực sự nào bởi vì nó làm giảm thiểu lưu lượng hệ thống. Mức độ đồng
thời có lẽ là một tham số quan trọng nhất trong các hệ phân tán. Do vậy, cơ chế điều
khiển đồng thời cố gắng tìm ra một phương án thích hợp, vừa duy trì được tính nhất
qn của cơ sở dữ liệu, vừa duy trì được mức độ đồng thời cao.
1. Xử lý các giao tác (Transaction Processing):

Giao tác là một chuỗi lệnh thực hiện trên các đối tượng dữ liệu (các
dòng - tuples, cột- fields) trong một hệ cơ sở dữ liệu (CSDL). Các lệnh của giao tác
bao gồm:
 Các lệnh thực hiện:
o Read(): Đọc dữ liệu từ CSDL và trả về giá trị phần tử được lưu trong
CSDL.
o Write(): Lưu giá trị của phần tử vào CSDL.
 Các lệnh giao tác:
o Start(): Bắt đầu thực hiện một giao tác.
o Commit(): Kết thúc thành công một giao tác.
o Abort(): Hủy bỏ một giao tác.
Các bộ phận quản lý thực hiện một giao dịch của Hệ quản trị CSDL:

Hình 1: Các bộ phận quản lý thực hiện giao tác
Trong đó:
Transactions: Các giao tác;
Transaction manager (TM): Bộ quản lý giao tác thực hiện các thao tác CSDL
thay cho ứng dụng;


Học viên: Huỳnh Văn Anh – Lớp KHMT – K25


Tiểu luận môn Hệ tin học phân tán
Scheduler (SC): Bộ lập lịch có nhiệm vụ thực hiện các thuật tốn kiểm soát
đồng hành nhằm đồng bộ các thao tác truy cập vào CSDL.
Data Manager (DM): Bộ quản lý dữ liệu
BEGIN_TRANSACTION, END_TRANSACTION: bắt đầu và kết thúc giao
tác
Timestamp: Dấu thời gian
LOCK/Release: Khóa/Giải phóng
a. Mỗi giao tác liên kết tất cả các tác vụ đọc/ghi của nó với bộ quản lý giao tác
(TM)
b. TM liên kết từng giao tác đọc ghi với SC
c. Bộ SC điều khiển chuỗi giao tác, theo đó DM xử lý các lệnh dọc/ghi và duy trì
điều khiển đồng thời.
Khi SC nhận một thao tác từ TM, nó có ba cách chọn lựa:
• Ngay lập tức lập lịch cho thao tác đó (bằng cách gửi nó đến bộ DM);
• Trì hỗn thao tác (bằng cách chèn nó vào trong một hàng đợi nào đấy); hoặc
• Từ chối thao tác.
Bộ DM sẽ thực hiện từng lệnh đọc/ghi nhận được. Đối với tác vụ đọc, bộ DM
duyệt CSDL cục bộ và trả về giá trị yêu cầu. Đối với tác vụ ghi, bộ DM sửa đổi CSDL
cục bộ và và trả về một ghi nhận chấp thuận thao tác cho bộ SC. Đến lượt, bộ SC trả
về cho TM và TM trả về cho giao tác.
Các bộ phận quản lý thực hiện các giao dịch phân tán của hệ quản trị CSDL
phân tán.

Hình 2: Các bộ phận quản lý thực hiện giao dịch phân tán
2. Khóa chốt cơ bản:


Việc điều khiển đồng thời bằng khoá chốt là một cơ chế thường dùng để
giải quyết những vấn đề liên quan đến việc đồng bộ hoá dữ liệu truy cập dùng chung,
đảm bảo dữ liệu dùng chung cho các thao tác tương tranh chỉ được truy xuất một lần
một giao dịch. Mỗi phần tử dữ liệu đều có một khố chốt kết hợp với chúng.

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25


Tiểu luận môn Hệ tin học phân tán

Điều này được thực hiện bằng cách liên kết một khoá chốt với mỗi đơn
vị khoá. Khoá này được giao dịch đặt ra trước khi nó truy xuất và được điều chỉnh lại
vào lúc nó hết sử dụng. Hiển nhiên là một đơn vị khố khơng thể truy xuất được nếu
đã bị khố bởi một giao dịch khác. Vì vậy, u cầu khố của một giao dịch chỉ được
trao nếu khoá đi kèm hiện không bị một giao dịch khác giữ.

Bộ xếp lịch đảm bảo rằng chỉ duy nhất giao tác có thể giữ khố chốt
trong một thời điểm, và chỉ có một giao tác có thể truy xuất dữ liệu đó tại cùng một
thời điểm.

Khoá chốt được bộ xếp lịch (Schedule manager) dùng để đảm bảo tính
khả tuần tự.

Trước khi một giao tác có thể truy cập dữ liệu dùng chung, bộ xếp lịch
sẽ khảo sát trạng thái khoá chốt của những dữ liệu này.
 Nếu khơng có giao tác nào khác đang giữ chúng thì bộ xếp lịch sẽ phát lệnh
thơng báo khố dữ liệu này lại và sau đó các giao tác thực hiện các lệnh của
mình trên dữ liệu đó.
 Nếu dữ liệu đang bị khố bởi giao tác T2, thì giao tác này phải chờ cho đến
khi nào T2 giải phóng khố đó.


Bởi vì chúng ta quan tâm đến việc đồng bộ hóa các thao tác tương tranh
của các giao dịch tương tranh nên có hai loại khóa chốt được kèm với mỗi đơn vị
khóa: Khóa đọc (Read Lock - RL), và Khóa Ghi (Write Lock - WL).
 RLi(x): khoá đọc trên phần tử dữ liệu x của giao tác Ti
 WLj(x): khoá ghi trên phần tử dữ liệu x của giao tác Tj
Hai khoá pli(x) và qlj(y) đụng độ nếu x=y, i≠j, có nghĩa rằng chúng khố trên
cùng một phần tử dữ liệu, chúng được phát sinh từ hai giao tác khác nhau và một
trong hai thao tác là ghi.

Một giao dịch Ti đang muốn đọc một mục dữ liệu được chứa trong đơn
vị khóa x sẽ nhận được một khóa đọc trên x (ký hiệu là rl i(x) và cũng tương tự như vậy
với thao tác ghi.

Tính tương thích của các thực thể khóa được mơ tả trong bảng sau:
RLi(x)
WLi(x)
RLi(x)
Tương thích
Khơng tương thích
WLi(x) Khơng tương thích Khơng tương thích

Những quy tắc quản lý và sử dụng khoá:
 Qui tắc 1:
Khi nhận được một thao tác pi[x] từ bộ quản lý giao tác (Transaction
Manager, TM), bộ xếp lịch kiểm tra nếu pli[x] đụng độ với một vài qlj[x] được
đặt trước đó.
o Nếu đúng, nó sẽ trì hỗn pi[x] và buộc Ti chờ cho đến khi nó có thể đặt
được khố cần thiết.
o Nếu khơng đụng độ, bộ xếp lịch (scheduler) sẽ đặt pli[x] và gởi pi[x] đến

bộ quản lý dữ liệu (Data Manager, DM).
Quy tắc này nhằm hạn chế hai giao tác truy xuất đồng thời một phần tử dữ
liệu trong tình trạng đụng độ.
 Qui tắc 2:

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25


Tiểu luận môn Hệ tin học phân tán
Mỗi khi bộ xếp lịch đặt khố cho Ti, pli[x], nó khơng thể giải phóng khố
đó cho đến khi DM trả lời đã xử lý thao tác tương ứng của khoá, pi[x].
 Qui tắc 3:
Mỗi khi bộ xếp lịch đã giải phóng một khố cho một giao tác, nó khơng thể
lấy tiếp bất kỳ khố nào cho giao tác đó.
* Quy tắc (3) được gọi là quy tắc hai giai đoạn, là nguồn gốc của khoá chốt hai
giai đoạn.
3. Các phương pháp kiểm soát đồng thời
a. Thực thi tuần tự

Một lúc chỉ cho phép thực thi một giao tác cho đến khi giao tác đó kết
thúc thì giao tác kế tiếp mới được thực hiện.

Thực thi này là phương pháp đơn giản và chính xác vì giao tác hoạt động
một cách riêng biệt trong một khoảng thời gian nhất định.

Ví dụ: cho ba giao tác cùng với tập các lệnh thực hiện như sau:
T1: Read(x)
T2: Write(x)
T3: Read(x)
Write(x)

Write(y)
Read(y)
Commit
Read(z)
Read(z)
Commit
Commit
khi đó ta có lịch biểu:
H1={W2(x),R1(x),R3(x),W1(x),C1,W2(y),R3(y),R2(z),C2,R3(z),C3}
b. Thực thi khả tuần tự

Một thực thi được gọi là khả tuần tự nếu nó có cùng một kết xuất và tác
động lên CSDL như khi thực thi tuần tự của cùng một giao tác. Vì thực thi tuần tự là
đúng và vì thực thi mỗi thực thi khả tuần tự có cùng một tác động như thực thi tuần tự
nên các thực thi khả khả tuần tự cùng phải đúng.

Các thực thi mất mát thông tin khi cập nhật và phục hồi tranh chấp là
những điển hình của thực thi bất khả tuần tự. Ví dụ ta thực hiện hai giao dịch gửi tiền
(Deposit) tuần tự sẽ nhận được khết quả khác khi thực hiện xen kẽ, nghĩa là có sự mất
mát thơng tin. Vì vậy thực thi xen kẽ là bất khả tuần tự. Tương tự như vậy, việc thực
thi xem kẽ hai giao tác Chuyển tiền (Transfer) và PrintSum sau :
//Thủ tục tin tổng số dư hai tài khoản
Procedure PrintSum begin
Start;
input(account1, account2);
templ : = Read( Accounts[ accountl]);
output(temp1);
temp2 : = Read(Accounts[account2]);
output(temp2);
templ := templ + temp2;

output(temp1);
Commit
end
có kết quả khác nhau như khi mỗi giao tác thực thi tuần tự và vì thế chúng cũng
bất khả tuần tự.

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25


Tiểu luận môn Hệ tin học phân tán

Mặc dù hai thực thi xem kẽ này là bất khả tuần tự nhưng lại có nhiều
thực thi khác khả tuần tự. Ví dụ, cho hai giao tác Transfer và PrintSum được thực hiện
xen kẽ như sau:
Read,(Accounts[7]) returns the value $200
Write,(Accounts[7], $100)
Read,(Accounts[7]) returns the value $100
Read,( Accounts[ 861) returns the value $200
Write,(Accounts[86], $300)
Commit,
Read,(Accounts[86]) returns the value 5300
Commit,
Thực thi này có tác động tương tự như khi thực hiện Transfer theo sau đó là PrintSum.

Mặc dù thứ tự thực hiện của các thao tác trong thực thi tuần tự là khác so
với thực thi xen kẽ, nhưng kết quả của mỗi thao tác lại chính xác như khi thực thi xen
kẽ. Vì thế thực thi xen kẽ như trên gọi là khả tuần tự.

Tính khả tuần tự là định nghĩa của tính chính xác cho điều khiển đồng
hành trong các DBS

* Lịch biểu khả tuần tự:

Lịch biểu của một giao dịch là một chuỗi các lệnh được thực hiện trong
hệ thống theo thứ tự thời gian. Một lịch biểu đối với một tập các giao dịch phải bao
gồm tất cả các lệnh của tất cả các giao dịch này, và phải bảo toàn thứ tự mà các lệnh
xuất hiện trong mỗi giao dịch cá thể theo thứ tự đó. Lịch biểu tạo mối liên hệ ràng
buộc giữa các giao dịch với nhau.

Một lịch biểu S được gọi là khả tuần tự nếu và chỉ nếu nó tương đương
tương tranh với một lịch biểu tuần tự. Tính khả tuần tự được định nghĩa như thế cũng
được gọi là khả tuần tự theo tương tranh bởi vì nó được định nghĩa theo sự tương
đương tương tranh. Từ đó, chúng ta có thể chỉ ra rằng chức năng cơ bản của bộ phận
điều khiển đồng thời là tạo ra một lịch biểu khả tuần tự để thực hiện các giao tác đang
chờ.
Ví dụ về lịch biểu khả tuần tự: Có 3 giao dịch T1, T2, T3
T1
T2
T3
BEGIN_TRANSACTION BEGIN_TRANSACTION BEGIN_TRANSACTION
x = 0;
x = 0;
x = 0;
x = x + 1;
x = x + 2;
x = x + 3;
END_TRANSACTION
END_TRANSACTION
END_TRANSACTION
Lịch biểu cho các giao dịch trên:
Schedule 1 x = 0; x = x + 1; x = 0; x = x + 2; x = 0; x = x + 3

Schedule 2 x = 0; x = 0; x = x + 1; x = x + 2; x = 0; x = x + 3;
Schedule 3 x = 0; x = 0; x = x + 1; x = 0; x = x + 2; x = x + 3;

Hợp lệ
Hợp lệ
Bất hợp lệ

4. Sử dụng bộ quản lý khóa cơ bản:

Trong các hệ thống dùng khoá, bộ xếp lịch (scheduler) chính là bộ quản
lý khố (lock manager, LM). Bộ quản lý giao dịch sẽ chuyển cho bộ quản lý khoá các

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25


Tiểu luận môn Hệ tin học phân tán
thao tác cơ sở dữ liệu (đọc hoặc ghi) và các thông tin kèm theo (như mục dữ liệu cần
truy xuất, định danh của giao dịch đưa ra yêu cầu). Sau đó, bộ quản lý khố sẽ kiểm
tra đơn vị khố có chứa mục dữ liệu đó đã bị khố hay chưa. Nếu đã khố, và nếu thể
thức khố đó khơng tương thích với thể thức của giao dịch đang yêu cầu, thao tác sẽ bị
hỗn lại. Ngược lại, khố sẽ được đặt với thể thức mong muốn và thao tác này được
chuyển cho bộ xử lý dữ liệu để truy xuất cơ sở dữ liệu thực sự. Sau đó, bộ quản lý giao
dịch được thông tin về các kết quả thực hiện. Việc kết thúc giao dịch sẽ giải phóng các
khố của nó và làm khởi hoạt một giao dịch khác đang đợi truy xuất mục dữ liệu này.

Thuật toán khoá chốt cơ bản
{Các định nghĩa chuẩn bị cho các thuật toán được trình bày trong tiểu luận}
Declare-type
Operation: một trong số Begin-Transaction, Read, Write, Abort, hoặc Commit
DataItem : một mục dữ liệu trong cơ sở dữ liệu phân tán

TransactionId: một giá trị duy nhất được gán cho mỗi giao dịch
DataVal: một giá trị có kiểu dữ liệu cơ bản (nghĩa là số nguyên, số thực,…)
SiteId: một đinh danh duy nhất cho vị trí
Dbop: một bộ ba gồm
{một phép tốn trên cơ sở dữ liệu của ứng dụng}
opn: Operation
data: DataItem
tid: TransactionId
Dpmsg: một bộ ba gồm
{một thông báo từ bộ xử lý dữ liệu}
opn: Operation
tid: TransactionId
result: DataVal
Scmsg: một bộ ba gồm
{một thông báo từ bộ xếp lịch}
opn: Operation
tid: TransactionId
result: DataVal
Transation ← một bộ hai gồm
tid: TransactionId
body: thân giao dịch
Message ← một chuỗi ký tự cần được truyền đi
OpSet: một tập các Dbop
SiteSet: một tập các SiteIde
WAIT(msg: Message)
begin
{đợi cho đến khi có một thơng báo đến}
end
{Thuật toán 1. Bộ quản lý khoá cơ bản (Basic LM)}
Declare-var

msg : Message
dop : Dbop
Op : Operaeion
x : Dataltem
T : TransactionId

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25


Tiểu luận môn Hệ tin học phân tán
pm : Dpmsg
res : Dataval
SOP : Opset
Begin
repeat
WAIT(msg)
case of msg
Dbop:
begin
Op ← dop.opn
x ← dop.da ta
T ← dop.tid
case of Op
Begin-transaction:
begin
gởi dop đến bộ xử lý dữ liệu
end
Read or Write
{u cầu khố}
begin

tìm đơn vị khố lu sao cho x lu
if lu chưa bị khoá or thể thức khố lu tương thích với
Op then
begin
đặt khố trên lu ở thể thức 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:
{trả lời của bộ xử lý dữ liệu}
Begin
{yêu cầu mở khoá}
Op ← pm.opn
x ← pm.result
T ← pm.tid
tìm đơn vị khố lu sao cho x⊆ lu, giải phóng khố trên lu do T giữ
if khơng cịn khố nào trên lu and
có những thao tác đang đợi khoá lu trong hàng đợi then
begin
SOP ← thao tác đầu tiên trong hàng đợi

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25



Tiểu luận môn Hệ tin học phân tán
SOP ← SOP ∪ {O là một thao tác trên hàng đợi có thể khố lu ở
thể thức khố tương thích với các thao tác hiên hành trong SOP }
đặt các khoá 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
end-case
until forever
End. {Basic LM}
5. Những điểm cần cải tiến của bộ quản lý Khóa cơ bản:

Thuật tốn khóa được cho trong Thuật tốn 1 được trình bày ở trên
khơng đồng bộ hố chính xác các thực thi giao dịch. Điều này là do khi tạo ra các lịch
biểu khả tuần tự, các thao tác khóa và giải phóng khóa cũng cần phải được điều phối.
Vì vậy chúng ta minh họa nó bằng ví dụ như sau:
Ví dụ: Xét hai giao dịch sau đây:

T1:

Read(x)
x←x+1
Write(x)
Read(y)
y←y–1
Write(y)
Commit


T2:

Read(x)
x←x*2
Write(x)
Read(y)
y←y*2
Write(y)
Commit


Dưới đây là một lịch biểu hợp lệ được bộ quản lý khóa tạo ra khi sử
dụng Thuật toán 1:
S = {wl1(x) R1(x), W1(x), lr1(x), wl2(x), R2(x), W2(x), lr2(x), wl2(y),
R2(y), W2(y), lr2(y), C2, wl1 (y), R1(y), W1(y), lr1(y), Cl}
Ở đây LRi(z) biểu thị thao tác giải phóng khố trên z đang được Ti giữ.

Chú ý rằng S khơng khả tuần tự. Bởi vì, nếu trước lúc thực hiện các giao
dịch này, giá trị của x và y lần lượt là 50 và 20. Nếu S khả tuần tự, thì giá trị sau khi
thực hiện tương ứng là 102 và 38 nếu T 1 thực hiện trước T2, hoặc là 101 và 39 nếu T 2
thực hiện trước T1. Tuy nhiên kết quả thực hiện S cho ra giá trị của x và y lần lượt là
102 và 39. Điều đó chứng tỏ S khơng khả tuần tự.

Vấn đề lịch biểu S trong ví dụ này là thuật tốn khóa chốt đã giải phóng
các khố được một giao dịch giữ (chẳng hạn T 1) ngay khi lệnh đi kèm (đọc hoặc ghi)
được thực hiện; và đơn vị khố (chẳng hạn x) khơng cần truy xuất nữa. Tuy nhiên, bản
thân giao dịch đó đang khóa những mục khác (chẳng hạn y) sau khi nó giải phóng
khố trên x. Mặc dù điều này dường như có lợi vì làm tăng khả năng hoạt động đồng
thời, nó cho phép các giao dịch đan xen với nhau, làm mất đi tính biệt lập và tính

nguyên tử tổng thể. Đây chính là lập luận của phương pháp khoá chốt hai pha (TwoPhase Locking, 2PL).

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25


Tiểu luận mơn Hệ tin học phân tán
a. Khóa 2 pha (Two Phase Locking – 2PL)

2PL là một trong những kỹ thuật hiệu quả trong việc khắc phục một số
đụng độ cũng như thời gian chết trong quá trình thực hiện các lệnh của các giao tác.
Mỗi giao tác phải yêu cầu một khóa S trước khi đọc và một khóa X trước khi ghi.
Nếu khơng có sự đụng độ nào xảy ra, khóa có thể được cấp và giao tác có thể thực
hiện được, ngược lại, giao tác phải đợi đến khi sự đụng độ được gỡ bỏ.

2PL nhằm đồng bộ hoá việc đọc và ghi. Trước khi đọc mục dữ liệu x,
phải khóa x (khóa do đọc). Trước khi ghi lên x, giao tác phải khóa mục x (khóa do
ghi).
→ Nhiệm vụ của bộ xếp lịch hai giai đoạn là quản lý khoá và điều khiển giao tác khi
nào lấy và khi nào giải phóng khố.
Q trình cấp phát và thu hồi khóa được thể hiện ở biểu đồ khố 2PL sau:

Hình 3: Biểu đồ Khóa 2PL

Biểu đồ trên cho thấy bộ quản lý khóa giải phóng khóa ngay sau khi
hoàn tất việc truy xuất. Điều này cho phép các giao dịch đang đợi khoá tiếp tục
tiến hành và nhận khoá, do vậy, làm tăng hoạt động đồng thời.

Gọi Oper(T,x) là lệnh truy xuất mục dữ liệu x trong giao tác T. Dựa vào
kỹ thuật khóa chốt hai giai đoạn, ta có thể chia giao tác thành hai giai đoạn:
 Giai đoạn tăng trưởng (growing phase), trong giai đoạn này nó nhận

các khố và truy xuất các mục dữ liệu.
Khi bộ lập lịch nhận được lệnh Oper(T,x), nó kiểm tra lệnh này có tranh chấp với
những lệnh truy xuất trên x khác, đã được bộ lập lịch cấp khóa.
o Nếu nó tranh chấp, lệnh Oper(T,x) bị bị trì hỗn.
o Nếu khơng tranh chấp, bộ lập lịch sẽ cấp 1 khóa cho x và gửi lệnh này
đến bộ quản lý dữ liệu.
Bộ lập lịch sẽ khơng giải phóng khóa cho đến khi bộ quản lý dữ liệu đã thực hiện
xong lệnh Oper(T,x).
 Giai đoạn thu hồi (shrinking phase) là giai đoạn giải phóng những khố
của nó.

Khi bộ lập lịch bắt đầu giải phóng bất kỳ khóa nào của giao tác T thì nó
sẽ khơng cấp bất kỳ khóa nào cho T, cho dù các mục dữ diệu của T địi hỏi khóa.

Nếu T cứ địi hỏi khóa khi tiến trình giải phóng khóa xảy ra thì
chương trình phát sinh lỗi và giao tác sẽ gọi lệnh Abort.

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25


Tiểu luận mơn Hệ tin học phân tán

Điểm khố (lock point) là thời điểm giao dịch đã nhận được tất cả
các khố nhưng chưa bắt đầu giải phóng khóa nào. Vì thế điểm khóa xác định cuối giai
đoạn tăng trưởng và đầu giai đoạn thu hồi của một giao tác.

2PL được thiết kế cho các hệ thống CSDL tập trung: mỗi giao tác nhận
khóa chốt tại pha tăng trưởng theo thứ tự. Trong các hệ phân tán, việc xác định điểm
khóa là khó khăn vì ta khơng thể biết thời điểm pha tăng trưởng kết thúc.
→ Trong 2PL, bộ SC sẽ gán tất cả các khóa trong pha tăng trưởng(Growing

Phase) và giải phóng khóa trong pha thu hồi (Shrinking Phase).
→ Các quy tắc quản lý và sử dụng khóa:
Quy ước: oper(T,x) là một thao tác trên mục dữ liệu x của giao tácT.
* Quy tắc 1: khi nhận được một thao tác oper(T,x) từ bộ TM, bộ SC sẽ tiến hành kiểm
tra sự đụng độ với bất kỳ thao tác nào khác trên mục dữ liệu x mà đã được cấp khóa
trước đó.
- Nếu đúng, nó sẽ trì hỗn oper(T,x) và buộc giao tác T chờ cho đến khi có thể
đặt được khóa cần thiết.
- Nếu khơng, bộ SC sẽ cấp một khóa cho x và chuyển thao tác này cho bộ DM.
Quy tắc này nhằm hạn chế hai giao tác truy xuất đồng thời cùng một mục dữ liệu
trong tình trạng đụng độ.
Sự đụng độ khóa được biểu diễn bằng ma trận sau:

* Quy tắc 2: Bộ SC sẽ khơng giải phóng một khóa cho x cho đến khi bộ DM báo rằng
đã thực hiện thao tác tương ứng trên x.
* Quy tắc 3: Mỗi khi bộ SC đã giải phóng một khóa cho giao tác T, nó khơng thể cấp
tiếp một khóa nào khác cho T.
Vì vậy giao tác T sẽ khơng giải phóng khóa nếu nó chưa biết chắc rằng có cần
thêm một khóa nào khác nữa không.
Đây là quy tắc 2 giai đoạn (2PL: Growing Phase / Shrinking Phase) và là nguồn
gốc của 2PL.
* Ngoài ra, đối với 2PL cịn có một số chú ý sau:
♦ Mỗi giao tác phải đoạt được một khóa chốt S trước khi đọc và một khóa chốt X
trước khi ghi.
♦ Nếu có một khóa X đã được cấp cho mục dữ liệu x nào đấy thì sẽ khơng có bất
kỳ khóa nào khác (X cũng như S) được gán cho x tại cùng thời điểm.
♦ Nếu có một khóa S đã được cấp cho mục dữ liệu x thì sẽ khơng có khóa loại X
được gán cho x tại cùng thời điểm.
♦ Một giao tác không yêu cầu cùng một loại khóa đến lần thứ hai.
♦ Một giao tác khơng cần thiết yêu cầu phải cấp khóa S trên mục dữ liệu khi

đang giữ khóa X.
♦ Một giao tác T chỉ chứa một khóa đối với mỗi mục dữ liệu. Nếu T đã có khóa
S và yêu cầu khóa X thì khóa S sẽ được cập nhật thành khóa X.

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25


Tiểu luận mơn Hệ tin học phân tán
♦ Các khóa được quản lý bằng bảng khóa – Lock Table.
Bảng khố: mỗi bảng khố có một đầu vào cho mỗi đối tượng đang bị khố và
có cấu trúc như sau:
♦ Con trỏ trỏ đến hàng đợi của các khoá chốt đã được gán (hay đơn giản chỉ là số
lượng các giao tác hiện đang giữ khoá).
♦ Kiểu của khoá chốt (dành riêng hay chia xẻ).
♦ Con trỏ trỏ đến hàng đợi yêu cầu cấp khoá (các giao tác yêu cầu khoá ).

Trong bảng khoá, các yêu cầu mới (đối với mục dữ liệu) sẽ được thêm
vào cuối hàng đợi yêu cầu và được gán khố nếu nó phù hợp với tất cả các khố trước
đó và nếu giao tác bị bỏ qua, mọi yêu cầu đã được gán cùng như đang đợi của giao tác
đó sẽ bị xố.

Để đạt được hiệu quả tốt hơn cho thuật toán nên dùng một danh sách
chứa các khoá được nắm giữ bởi mỗi giao tác.

Thuật tốn chung dựa trên khóa: Khi cần truy cập vào một mục dữ liệu,
chúng ta cần đến một khóa và khi cần dùng đến khóa đó nữa thì sẽ giải phóng nó ra.
Ví dụ, có hai giao tác T1 và T2 , T1 có thể ghi vào mục dữ liệu x trước T2 và T2 lại có
thể ghi vào mục dữ liệu y trước T1. Như vậy khơng có gì đảm bảo tính tuần tự cả. Vì
lẽ đó chúng ta cần phải cân nhắc trong việc giữ khố để khơng có vấn đề gì xảy ra.
Đây là ý tưởng cơ bản của thuật tốn khóa hai pha.


Trong 2PL, tại pha tăng trưởng, các giao tác sẽ yêu cầu khóa cho mình
mà khơng có sự giải phóng bất kỳ khóa nào. Các khóa sẽ khơng được giải phóng cho
đến khi tất cả các khóa đã được gán hết. Sau khi tất cả các khóa đã được gán, các giao
tác được phép chuyển sang pha thu hồi. Tại đây, các khóa sẽ được phép giải phóng
vào thời điểm cần thiết.

Tuy nhiên việc cài đặt Khóa 2PL gặp nhiều khó khăn vì bộ quản lý khoá
phải biết rằng giao dịch đã nhận đủ tất cả mọi khố và sẽ khơng cịn cần khố một mục
nào nữa. Bộ quản lý khoá cũng phải biết rằng giao dịch khơng cịn cần truy xuất mục
dữ liệu đó nữa, vì thế khố có thể được giải phóng. Cuối cùng, nếu giao dịch bị huỷ bỏ
sau khi giải phóng một khố, nó có thể làm huỷ bỏ ln cả các giao dịch đã truy xuất
các mục đã mở khoá. Hiện tượng này được gọi là huỷ bỏ dây chuyền (cascading
abort). Vì những khó khăn đó, phần lớn các bộ xếp lịch 2PL đều cài đặt một dạng khắc
khe hơn có tên là khố chốt hai pha nghiêm ngặt (strict two-phase locking), trong đó
nó giải phóng tồn bộ các khoá vào lúc giao dịch kết thúc (uỷ thác hoặc bị huỷ bỏ).
b. Khoá hai pha nghiêm ngặt (Strict 2PL – S2PL)

2PL là một phiên bản mở rộng của nghi thức S2PL. Ngoài quy tắc các
giao tác cần phải yêu cầu cấp khoá đọc/ghi trước khi truy cập vào mục dữ liệu dùng
chung thì các quy tắc khác được quy định lại như sau:
→ Tất cả các khoá sẽ được các giao tác giữ lại cho đến khi kết thúc thao tác.
Biểu đồ khóa loại này được trình bày như sau:

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25


Tiểu luận mơn Hệ tin học phân tán

Hình 4: Biểu đồ khoá hai pha nghiêm ngặt


Tương tự như 2PL, S2PL cũng thực thi các giao tác trong hai pha: Pha
tăng trưởng và và pha còn lại là là pha mà các giao tác sử dụng các mục dữ liệu đã bị
khoá.
+ Giai đoạn tăng trưởng: giống với giai đoạn đầu của kỹ thuật khóa 2 pha.
+ Giai đoạn thu hồi khóa:
o Tất cả các khóa được giải phóng cùng một lúc sau khi giao tác T kết
thúc hoặc bị hủy bỏ.
o Khơng có thao tác đọc/ghi nào được thực hiện một khi khóa được giải
phóng bởi giao tác.
Nếu giao tác bị hủy bỏ thì việc phục hồi lại những thay đổi dữ liệu được thực
hiện trước khi khóa được giải phóng.

Bộ quản lý khố 2PL nghiêm ngặt chỉ sửa lại một ít trong Thuật tốn 1.
Thực sự chỉ cần sửa đổi phần xử lý các hồi đáp từ bộ xử lý dữ liệu nhằm đảm bảo
rằng các khoá chỉ được giải phóng nếu thao tác là uỷ thác hoặc huỷ bỏ. Tồn bộ
thuật tốn 2PL nghiêm ngặt được trình bày trong Thuật toán 2, thuật toán quản lý giao
dịch để xếp lịch theo 2PL được trình bày trong Thuật tốn 3.
Thuật toán 2. Thuật toán quản lý khoá bằng phương pháp khoá chốt hai pha
nghiêm ngặt (S2PL-LM).
declare-var
msg : Message
dop : Dbop
Op : Operaeion
x : Dataltem
T : TransactionId
pm : Dpmsg
res : Dataval
SOP : Opset
begin

repeat

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25


Tiểu luận môn Hệ tin học phân tán
WAIT(msg)
case of msg
Dbop:
begin
Op ← dop.opn
x ← dop.da ta
T ← dop.tid
case of Op
Begin-transaction:
begin
gởi dop đến bộ xử lý dữ liệu
end
Read or Write
{cần khố chốt}
begin
tìm đơn vị khoá lu sao cho x ⊆ lu
if lu chưa bị khố or thể thức khố lu tương thích với
Op then
begin
đặt khố trên lu ở thể thức thích hợp
gởi dop đến bộ xử lý dữ liệu
end
else đặt dop vào một hàng đợi cho 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ố lu bị khố bởi T do
begin
giải phóng khố trên lu do T giữ
if khơng cịn khố nào trên lu and
có các thao tác đang đợi khố lu trong hàng đợi then
begin
SOP ← thao tác đầu tiên trong hàng đợi

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25


Tiểu luận môn Hệ tin học phân tán
SOP ← SOP ∪ {

là một thao tác trên hàng đợi có thể khố lu
ở một thể thức khố tương thích với các thao tác hiên hành
trong

SOP }
đặt các khoá trên lu cho các thao tác trong SOP
for tất cả các thao tác 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 3. Bộ quản lý giao dịch 2PL (2PL-TM)
declare-var
msg : Message
dop : Dbop
Op : Operaeion
x : Dataltem
T : TransactionId
O : Dbop
res : Dataval
SOP : Opset
begin
repeat
WAIT(msg)
case of msg
Dbop:
begin
gởi O đến LM

end
Scmsg:
begin
Op ← sm.opn
res ← sm.result
T ← sm.tid
Case of Op
Read:
begin
trả res về cho ứng dụng của người sử dụng (nghĩa là giao dịch)
end
Write:
begin

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25


Tiểu luận môn Hệ tin học phân tán
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
huỷ vùng làm việc của T
thông tin cho ứng dụng biết về việc hồn tất thành cơng giao dịch T
end
Abort:
begin
thông tin cho ứng dụng biết về việc hoàn tất huỷ bỏ giao dịch T
end

end-case
end
end-case
until forever
end. {2PL-LM}

Chúng ta cần chú ý rằng mặc dù thuật toán 2PL cưỡng chế tính khả tuần
tự tương tranh, nó khơng cho phép tất cả mọi lịch biểu có tính khả tuần tự tương tranh.

Trong lý thuyết khả tuần tự, thứ tự tuần tự hoá các thao tác tương tranh
cũng quan trọng như việc phát hiện tương tranh và điều này có thể được tận dụng khi
định nghĩa các thể thức khoá. Hệ quả là ngồi các khố đọc (dùng chung, shared) và
khố ghi (độc quyền, exclusive), chúng ta có thể định nghĩa một thể thức khố thứ ba:
dùng chung có thứ tự (ordered shared). Khố dùng chung có thứ tự của một đối tượng
x bởi các giao dịch Ti và Tj mang ý nghĩa như sau: cho một lịch biểu S có các khố
dùng chung có thứ tự giữa các thao tác o Ti và p Tj, nếu Ti thu đựoc khoá o trước
khi Tj thu đựoc khố p thì o được thực thi trước p.

Nghi thức khoá cưỡng chế một ma trận tương thích có chứa các thể thức
khố dùng chung có thứ tự hồn tồn giống với 2PL, ngoại trừ là giao dịch khơng giải
phóng bất kỳ khố nào khi một trong các khố của chúng cịn đang được giữ. Bằng
khơng sẽ xảy ra các thứ tự tuần tự hố luẩn quẩn.
c. Vấn đề bế tắc (deadlock):

Vấn đề bế tắc luôn xảy ra trong các kỹ thuật dùng cơ chế khóa chốt.

Giả sử có 2 giao tác T1 và T2 thực hiện các lệnh đọc ghi trên mục dữ
liệu x và y như sau:
T1: lock (x); lock(y); read (x); write (y);
T2: lock (y); lock(x); read (y); write (x);

T1 chiếm giữ khóa x và cố gắng khóa y, T2 chiếm giữ khóa y và cố gắng khóa
x. Hiện tượng bế tắc sẽ xảy ra.
* Để khắc phục tình trạng này:
+ Thiết lập thời gian Timeout, nếu thời gian thực hiện giao tác vượt quá thời
gian Timeout thì hủy bỏ giao tác hoặc thực hiện thuật toán kiểm tra bế tắc.
+ Sắp xếp các mục dữ liệu và truy xuất chúng theo một thứ tự nhất định.
+ Giảm bớt việc đồng hành các giao tác.

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25


Tiểu luận môn Hệ tin học phân tán
PHẦN III : PHỤ LỤC PHẦN MỀM KIỂM TRA HOẠT ĐỘNG
BĂNG CƠ CHẾ THEN CÀI

1. Ý tưởng thực hiện:
Chúng ta xây dựng một phần mềm bằng ngôn ngữ JAVA tác động vào Cơ sở
dữ liệu (CSDL) MySQL. Trong CSDL, chúng ta xây dựng 03 bảng SERVER1,
SERVER2 và SERVER3. Đồng thời tạo 03 user: user1 chỉ được quyền tác động trên
Table SERVER1, user2 chỉ được quyền tác động trên Table SERVER2…
Chúng ta sẽ giả lập khi user1 thay đổi giá trị ở Server1 thì các user khác sẽ không tác động
được trên dữ liệu của mình vì CSDL đã bị lock.

Giao diện phần mềm:

2. Viết chương trình:
2.1 Tạo class mysql1 để kết nối với CSDL MySQL và thực hiện các lệnh truy vấn
CSDL:
Package hephantan;
import com.mysql.jdbc.ResultSetMetaData;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
public class mysql1 {
private Connection connect = null;

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25


Tiểu luận môn Hệ tin học phân tán
private Statement statement = null;
private PreparedStatement preparedStatement = null;
private ResultSet resultSet = null;
public void do_connect() throws Exception {
try {
// This will load the MySQL driver, each DB has its own driver
Class.forName("com.mysql.jdbc.Driver").newInstance();
connect = DriverManager.getConnection("jdbc:mysql://172.20.212.7/ipeng?"
+ "user=root&password=abc333");
// connect = DriverManager.getConnection("jdbc:mysql://localhost/ipeng?"
//
+ "user=root&password=root");
if (connect !=null) System.out.println("Connect thanh cong!");
} catch (Exception e) {
throw e;
}

}
public ResultSet do_select(String s) throws Exception {
try {
// Statements allow to issue SQL queries to the database
statement = connect.createStatement();
// Result set get the result of the SQL query
resultSet = statement.executeQuery(s);
} catch (Exception e) {
throw e;
} return resultSet;
}
public void do_update() throws Exception {
try {
preparedStatement = connect
.prepareStatement("insert into FEEDBACK.COMMENTS values (default, ?, ?, ?, ? , ?,
?)");
preparedStatement.setString(1, "Test");
preparedStatement.setString(2, "TestEmail");
preparedStatement.setString(3, "TestWebpage");
preparedStatement.setDate(4, new java.sql.Date(2009, 12, 11));
preparedStatement.setString(5, "TestSummary");
preparedStatement.setString(6, "TestComment");
preparedStatement.executeUpdate();
// Remove again the insert comment
preparedStatement = connect
.prepareStatement("delete from FEEDBACK.COMMENTS where myuser= ? ; ");
preparedStatement.setString(1, "Test");
preparedStatement.executeUpdate();
} catch (Exception e) {
throw e;


Học viên: Huỳnh Văn Anh – Lớp KHMT – K25


Tiểu luận môn Hệ tin học phân tán
} finally {
close();
}
}
private void writeMetaData(ResultSet resultSet) throws SQLException {
System.out.println("The columns in the table are: ");
System.out.println("Table: " + resultSet.getMetaData().getTableName(1));
for (int i = 1; i<= resultSet.getMetaData().getColumnCount(); i++){
System.out.println("Column " +i + " "+ resultSet.getMetaData().getColumnName(i));
}
}
private void writeResultSet(ResultSet resultSet) throws SQLException {
// ResultSet is initially before the first data set
while (resultSet.next()) {
// e.g. resultSet.getSTring(2);
String user = resultSet.getString("sysname");
String website = resultSet.getString("name");
String summery = resultSet.getString("IP");
System.out.println("Sysname: " + user);
System.out.println("Tên: " + website);
System.out.println("IP: " + summery);
}
}
// You need to close the resultSet
public void close() {

try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connect != null) {
connect.close();
}
System.out.println("Disconnected !");
} catch (Exception e) {
}
}
}

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25


Tiểu luận môn Hệ tin học phân tán
2.3 Xây dựng class tạo form và thực hiện thay đổi CSDL:
public class form1 extends javax.swing.JFrame {
mysql1 thietbi=new mysql1(); // Kết nối CSDL
public form1() {
initComponents();
this.setLocationRelativeTo(null);
this.setTitle("IP Eng - by HVA");
// redirectSystemStreams();
try {
thietbi.do_connect();

ResultSet resultSet=thietbi.do_select("select * from cmlist");
ResultSetMetaData md = resultSet.getMetaData();
int columnCount = md.getColumnCount();
Vector columns = new Vector(columnCount);
columns.add("ID");
columns.add("COMMAND");
Vector data = new Vector();
Vector row;
while(resultSet.next())
{
row = new Vector(columnCount);
// for(int i=1; i<=columnCount; i++)
{
row.add(resultSet.getString(1));
row.add(resultSet.getString(2));
}
data.add(row);
}
jTable1.setModel(new DefaultTableModel(data,columns));
jTable1.removeColumn(jTable1.getColumnModel().getColumn(0));

} catch (Exception ex) {
Logger.getLogger(form1.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void updateTextArea(final String text) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
textArea.append(text);
}

});
}
private void redirectSystemStreams() {
OutputStream out = new OutputStream() {

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25


Tiểu luận môn Hệ tin học phân tán
@Override
public void write(int b) throws IOException {
updateTextArea(String.valueOf((char) b));
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
updateTextArea(new String(b, off, len));
}
@Override
public void write(byte[] b) throws IOException {
write(b, 0, b.length);
}
};
System.setOut(new PrintStream(out, true));
System.setErr(new PrintStream(out, true));
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
sysname = new javax.swing.JTextField();
jLabel2 = new javax.swing.JLabel();

jScrollPane1 = new javax.swing.JScrollPane();
jTable2 = new javax.swing.JTable();
jScrollPane2 = new javax.swing.JScrollPane();
jTable1 = new javax.swing.JTable();
jPanel1 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
u1 = new javax.swing.JTextField();
jLabel3 = new javax.swing.JLabel();
u2 = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
jLabel4 = new javax.swing.JLabel();
jScrollPane3 = new javax.swing.JScrollPane();
textArea = new javax.swing.JTextArea();
jLabel5 = new javax.swing.JLabel();
jClear = new javax.swing.JCheckBox();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
formWindowClosing(evt);
}
});
sysname.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
sysnameActionPerformed(evt);

Học viên: Huỳnh Văn Anh – Lớp KHMT – K25


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×