Tải bản đầy đủ
1 Cơ sở lý thuyết

1 Cơ sở lý thuyết

Tải bản đầy đủ

- 57 -

Một giao dịch luôn phải kết thúc ngay cả khi có xảy ra sự cố. Nếu giao dịch
có thể hoàn tất thành công tác vụ của nó, ta nói rằng giao dịch có uỷ thác (commit).
Ngược lại nếu một giao dịch phải ngừng lại khi chưa hoàn tất công việc, ta nói rằng
nó bị huỷ bỏ (abort). Khi một giao dịch bị huỷ bỏ, quá trình thực thi sẽ ngừng và tất
cả mọi hành động đã được thực hiện đều phải được phục hồi lại, đưa CSDL về trạng
thái trước khi thực hiện giao dịch.
- Các tính chất của giao dịch


Tính nguyên tử
Tính nguyên tử (automicity) liên quan đến sự kiện là một giao dịch được xử

lý như một đơn vị hoạt tác. Chính vì thế mà các hành động của giao dịch, hoặc tất
cả đều hoàn tất hoặc không một hành động nào hoàn tất. Tính nguyên tử đòi hỏi
rằng nếu việc thực thi giao dịch bị cắt ngang bởi một loại sự cố nào đó thì DBMS sẽ
chịu trách nhiệm xác định công việc cần thực hiện đối với mỗi giao dịch để khôi
phục lại sau sự cố. Có hai chiều hướng hành động: hoặc nó sẽ được kết thúc bằng
cách hoàn tất các hành động còn lại, hoặc có thể được kết thúc bằng cách hồi phục
lại tất cả các hành động đã thực hiện.


Tính nhất quán
Tính nhất quán (consistency) của một giao dịch chỉ đơn giản phản ánh tính

đúng đắn của nó. Nói cách khác, một giao dịch là một chương trình đúng đắn ánh
xạ CSDL từ trạng thái nhất quán này sang một trạng thái nhất quán khác.


Tính biệt lập
Biệt lập (isolation) là tính chất của các giao dịch, đòi hỏi mỗi giao dịch phải

luôn nhìn thấy CSDL nhất quán. Nói cách khác, một giao dịch đang thực thi không
thể làm lộ ra các kết quả của nó cho các giao dịch khác đang cùng hoạt động trước
khi nó uỷ thác.


Tính bền vững
Tính bền vững (durability) muốn nói đến tính chất của giao dịch, bảo đảm

rằng một khi giao dịch uỷ thác, kết quả nó được duy trì cố định và không bị xoá ra

- 58 -

khỏi CSDL. Vì thế DBMS bảo đảm rằng kết quả của giao dịch sẽ vẫn tồn tại dù có
xảy ra sự cố hệ thống.
3.1.2 Các vấn đề về xung đột dữ liệu và một số giải thuật điều khiển
- Lý thuyết khả tuần tự
Hai giao tác Oij và Okl (i và k không nhất thiết phải phân biệt) cùng truy cập
đến một thực thể CSDL x được gọi là có tương tranh nếu ít nhất một trong chúng là
thao tác ghi (write). Có hai vấn đề mà chúng ta cần lưu ý là, trước tiên hai giao tác
đọc không tương tranh với nhau. Vì thế chúng ta có thể nói về hai loại tương tranh:
đọc - ghi (read - write) và ghi - ghi (write - write). Thứ hai, hai giao tác này có thể
thuộc về cùng một giao dịch hoặc thuộc về hai giao dịch khác nhau. Trong trường
hợp sau, hai giao dịch được gọi là có tương tranh. Về trực quan, sự tồn tại của một
tương tranh giữa hai giao tác cho thấy rằng thứ tự thực hiện của chúng là quan
trọng. Việc sắp thứ tự cho hai giao tác đọc là không cần thiết.
- Phân loại các cơ chế điều khiển đồng thời
Chúng ta sẽ xếp các cơ chế điều khiển đồng thời làm hai nhóm lớn: các
phương pháp điều khiển đồng thời lạc quan và các phương pháp điều khiển đồng
thời bi quan. Các thuật toán bi quan đồng bộ hoá việc thực hiện đồng thời của các
giao dịch trước khi thực thi chúng, trong khi đó các thuật toán lạc quan để việc đồng
bộ hoá các giao dịch đến khi chúng kết thúc. Nhóm lạc quan gồm có các thuật toán
dựa theo khóa chốt (locking-based algorithm), các thuật toán dựa theo thứ tự các
giao dịch và các thuật toán lai (hybrid algorithm). Tương tự, nhóm lạc quan cũng có
thể được phân loại thành các thuật toán dựa trên khoá chốt và các thuật toán theo
thứ tự thời gian.
Trong cách tiếp cận dùng khoá chốt, việc đồng bộ hoá giao dịch có được bằng
cách sử dụng khoá chốt vật lý hoặc logic trên một phần CSDL. Lớp cơ chế này
được chia nhỏ hơn nữa tuỳ theo vị trí thực hiện các hoạt động quản lý khoá:
1. Trong lối khoá tập quyền, một trong các vị trí của mạng được chỉ định làm vị trí
chính, ở đó lưu trữ các bảng khoá cho toàn bộ CSDL và chịu trách nhiệm trao
khóa cho giao dịch.

- 59 -

2. Theo lối khoá bản chính thì ngược lại một trong các bản sao (nếu có nhiều bản)
của mỗi đơn vị khoá được chỉ định làm bản chính (primary copy) và đó chính là
bản sẽ bị khoá khi giao dịch truy xuất đến đơn vị đó. Nếu CSDL không được
nhân bản (nghĩa là mỗi đơn vị khoá chỉ có một bản duy nhất), các cơ chế khoá
bản chính sẽ phân phối trách nhiệm quản lý khoá cho một số vị trí.
3. Theo lối khoá phi tập trung, nhiệm vụ quản lý khoá là của tất cả các vị trí trong
mạng. Trong trường hợp này, thực hiện một giao dịch có sự tham gia và điều
phối của bộ xếp lịch tại nhiều vị trí. Mỗi bộ xếp lịch cục bộ chịu trách nhiệm về
các đơn vị khoá nằm cục bộ tại vị trí đó.
Lớp cơ chế theo thứ tự thời dấu (timestamp ordering, TO) phải tổ chức thứ tự
thực hiện các giao dịch nhằm duy trì được tính nhất quán lẫn tương hỗ giữa các vị
trí (liên nhất quán). Việc xếp thứ tự này được duy trì bằng cách gán thời dấu cho cả
giao dịch lẫn mục dữ liệu được lưu trong CSDL. Những thuật toán này có thể thuộc
loại cơ bản (basic TO), đa bản (multiversion TO), hoặc bảo toàn (conservative TO).
- Các thuật toán điều khiển đồng thời bằng khóa chốt
Ý tưởng chính của việc điều khiển đồng thời bằng khoá chốt là đảm bảo dữ
liệu dùng chung cho các thao tác tương tranh chỉ được truy xuất mỗi lần một giao
dịch. Điều này được thực hiện bằng cách liên kết một khoá chốt (lock) 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. Một đơn vị khoá không thể truy xuất được nếu đã bị
khoá bởi một giao dịch khác. Vì vậy, yêu cầu khoá 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 nào giữ.
Có hai loại khoá chốt (thường được gọi là thể thức khoá, lock mode) được đi
kèm với mỗi đơn vị khoá: khoá đọc (read lock) và khoá ghi (write lock). Một giao
dịch Ti đang muốn đọc một mục dữ liệu chứa trong đơn vị khoá x sẽ nhận được một
khoá đọc trên x [ký hiệu là rli(x)] và cũng tương tự như thế đối với các thao tác ghi.
Hai thể thức khoá là tương thích (compatibility) nếu hai giao dịch truy xuất đến
cùng một mục dữ liệu có thể nhận được khoá trên mục dữ liệu đó cùng một lúc.
Các khoá đọc là tương thích với nhau còn các khoá đọc - ghi, ghi - ghi thì

- 60 -

không. Vì vậy, hai giao dịch vẫn có thể đồng thời đọc cùng một mục dữ liệu.
- Các thuật toán điều khiển đồng thời bằng thời dấu
Không giống như các thuật toán dựa vào khoá, các thuật toán điều khiển
đồng thời bằng thời đấu không cố gắng duy trì tính khả tuần tự bằng phương pháp
độc quyền truy xuất. Thay vào đó, chúng chọn trước một thứ tự tuần tự hoá và thực
hiện các giao dịch theo thứ tự đó. Để làm được điều này, bộ quản lý giao dịch gán
cho mỗi giao dịch Ti một thời dấu (timestamp) duy nhất ts(Ti) vào lúc khởi sự. Thời
dấu là một định danh đơn giản dùng để nhận ra mỗi giao dịch một cách duy nhất và
xếp thứ tự chúng. Thời dấu là một bộ hai ngôi có dạng danh vị trí>.
- Các thuật toán điều khiển đồng thời lạc quan
Các thuật toán đã biết trong phần trước về bản chất thuộc loại bi quan
(pesimistic). Nói cách khác, chúng ta giả định rằng tương tranh giữa các giao dịch
rất hay xảy ra và không cho phép một giao dịch truy xuất một mục dữ liệu nếu có
một giao dịch tương tranh đang truy xuất mục dữ liệu đó. Vì vậy việc thực hiện một
thao tác của một giao dịch trải qua một dãy các pha: thẩm tra (validation, V), đọc
(read, R), tính toán (computation, C), ghi (write, W). Nói chung dãy thao tác này có
giá trị đối với mỗi giao dịch cập nhật cũng như đối với mỗi thao tác của nó.
Ngược lại, các giao dịch lạc quan (optimistic) trì hoãn pha thẩm tra cho đến
ngay trước pha ghi. Vì vậy một thao tác được trao cho bộ xếp lịch lạc quan không
bao giờ bị trì hoãn. Các thao tác đọc, tính toán, và ghi được thực hiện tự do mà
không cập nhật vào CSDL thực sự. Mỗi giao dịch lúc đầu đều cập nhật trên các bản
sao cục bộ của mục dữ liệu. Pha thẩm tra bao gồm việc kiểm xem những cập nhật
này có duy trì tính nhất quán của CSDL hay không. Nếu có, các thay đổi được thực
hiện thực sự (nghĩa là ghi vào CSDL thực tế). Ngược lại, giao dịch sẽ bị huỷ bỏ và
phải khởi động lại.
- Quản lý khóa


Khoá chốt (lock)

- 61 -

Khoá chốt là một đặc quyền truy xuất trên một mục dữ liệu mà bộ quản lý
khoá chốt có thể trao cho một giao tác hay thu hồi lại. Một giao tác muốn truy xuất
tới một mục dữ liệu thì nó yêu cầu một khoá chốt cho mục dữ liệu đó, sau khi được
trao khoá và hoàn thành các thao tác cần thiết thì nó phải mở khoá (unlock) để các
giao tác khác lại có thể truy xuất tới mục dữ liệu đó.


Khoá sống (life lock)
Khoá sống là hiện tượng một giao tác T 1 yêu cầu một khoá trên một mục dữ

liệu đồng thời cũng có giao tác T 2 cũng yêu cầu khoá đó, và hệ thống trao khoá cho
giao tác T2, rồi khi giao tác T2 thực hiện xong các thao tác trên mục dữ liệu và mở
khoá thì lại có một giao tác T3 khác yêu cầu khoá, hệ thống lại trao khoá cho giao
tác này… quá trình như vậy cứ tiếp tục xảy ra, và rất có thể T 1 cứ phải chờ đợi một
cách hoài vọng. Hiện tượng khoá sống có thể được khắc phục bằng cách sử dụng
chiến lược “đến trước phục vụ trước”, nhưng chiến lược này đôi khi lại gây ra một
hiệu quả trái ngược.
• Khoá chết (deadlock)
Khoá chết là tình huống mà mỗi thành viên trong một tập S gồm hai hay
nhiều giao tác đang đợi nhận khoá của một mục dữ liệu hiện đang bị khoá bởi một
giao tác khác trong tập S. Bởi mỗi giao tác trong tập S đều đang đợi, nên nó không
thể mở khoá cho mục dữ liệu mà một giao tác khác đang cần, vì vậy tất cả các giao
tác vẫn cứ tiếp tục phải đợi mãi mãi. Việc khắc phục hiện tượng khoá gài là một vấn
đề luôn được nghiên cứu, và cũng đã có một số giải pháp cho vấn đề này.

- 62 -

3.2 Xây dựng chương trình thử nghiệm
3.2.1 Sơ đồ UML
- Sơ đồ UML của ứng dụng truyền file

Remote
<>

FileLock

UnicastRemoteObject

NLS_NAME

LOCK_NAME
isLocked()
lock()
unlock()

FileTransferImpl
SharedFileLock
file
lockFile
locks
getLockFor()
isLocked()
lock()
reallyLock()
unlock()

<>

FileTransfer

nameObj
Id
input
output
locked

getID()
downloadFileSimple()
beginDownload()
downloadFile()
endDownload()
deleteFile()
renameFile()
fileInfo()
checkFile()
beginSaveFile()
saveFile()
endSaveFile()
getSharedLockFor()
isFileLocked()
lock()
unlock()

- 63 -

- Sơ đồ UML của ứng dụng Bán sách qua mạng

Serializable

UnicastRemoteObject
Remote

RsSerializable
java.sql.ResultSet()

DatabaseImpl
databaseName
userName
passName
RsServer
conn
Stmt
DBDriver
url
Id
locked
getID()
connectDatabase()
closeDatabase()
Begin_Transaction()
End_Transaction()
COMMIT()
ROLLBACK()
getAUTOCOMMIT()
getResultSet()
querySQL()
setTRANSACTION()
getTRANSACTION()
isLocked()
Lock()
Unlock()

<>

Database
getID()
connectDatabase()
closeDatabase()
Begin_Transaction()
End_Transaction()
COMMIT()
COMMIT()
getAUTOCOMMIT()
getResultSet()
querySQL()
setTRANSACTION()
getTRANSACTION()
isLocked()
Lock()
Unlock()

3.2.2 Lập trình mođun demo
Trong ví dụ có sử dụng các mẫu tương tranh (Concurrency Patterns) như:
Critical Section, Consistent Lock Order, Guarded Suspension, Read-Write Lock.
 Chương trình Truyền file xây dựng trên mô hình Client – Server.
- Giao diện chương trình bên phía trình chủ đăng ký tên máy chủ và số hiệu cổng.