QUẢN LÝ GIAO DỊCH

Một phần của tài liệu Cơ sở dữ liệu (Trang 100)

5.3.1. Khái niệm giao dịch

Một giao dịch bao gồm một tập các thao tác để thực hiện một đơn vị công việc. Chẳng hạn, để thực hiện việc chuyển số tiền X từ một tài khoản A sang một tài khoản B trong một CSDL của ngân hàng cần thực hiện các tác:

1. Đọc số tiền từ tài khoản A.

2. Lấy số tiền trong tài khoản A trừ đi X. 3. Cập nhật số tiền mới vào tài khoản A. 4. Đọc số tiền trong tài khoản B.

5. Lấy số tiền trong tài khoản B cộng thêm X 6. Cập nhật số tiền mới vào tài khoản B.

Các thao tác trên tạo thành một giao dịch Ti, có thể mô tả như sau: Ti: read(A); A:=A-X; write(A); read(B); B=B+X; write(B);

Một giao dịch được tạo ra khi chúng ta thực hiện việc đọc ghi trên cơ sở dữ liệu. Phần lớn các giao dịch trong cơ sở dữ liệu được tạo bởi hai hay nhiều yêu cầu từ cơ sở dữ liệu. Mỗi yêu cầu tương ứng với một câu lệnh trong chương trình ứng dụng.

5.3.2. Các tính chất của giao dịch

Một trong những điều kiện quan trọng đối với các giao dịch là phải đảm bảo tính toàn vẹn của dữ liệu, nghĩa là phải đảm bảo cho dữ liệu được chính xác ở mọi lúc, mọi nơi. Muốn vậy, các giao dịch phải có các tính chất sau:

- Tính nguyên tố: Nghĩa là, hoặc tất cả các thao tác của giao dịch được hoàn thành, hoặc tất cả chúng phải được hủy bỏ. Nói một cách khác, giao dịch được coi như một đơn vị đơn không thể phân chia được.

- Tính nhất quán: Sự thực hiện của một giao dịch phải đảm bảo tính nhất quán của CSDL, nghĩa là giao dịch phải biến đổi CSDL từ trạng thái toàn vẹn này đến trạng thái toàn vẹn khác.

- Tính độc lập: Đảm bảo sao cho dữ liệu được sử dụng trong việc thực hiện giao dịch không thể được sử dụng bởi giao dịch thứ hai cho đến khi giao dịch thứ nhất được hoàn thành. Nói một cách khác, nếu một giao dịch T1 đang được thực hiện và đang sử dụng mẫu dữ liệu X, thì mẫu dữ liệu này không thể được truy cập bởi các giao dịch khác(T2,…,Tn) cho đến khi T1 được kết thúc. Đây là tính chất đặc thù trong môi trường cơ sở dữ liệu đa người dùng bởi vì một số người sử dụng khác nhau có thể truy cập và cập nhật cơ sở dữ liệu cùng một thời điểm.

-Tính bền vững: Đảm bảo rằng khi một giao dịch được hoàn thành, tất cả các cập nhật nó đã thực hiện trên cơ sở dữ liệu là bền vững, kể cả khi có lỗi hệ thống.

5.3.3. Đánh giá các giao dịch

Một giao dịch là một đơn vị logic của công việc mà nó phải được phải hoàn thành hoặc là hủy bỏ; không có trạng thái trung gian. Nói một cách khác, một giao dịch đa thành phần không được phép hoàn thành từng phần riêng lẻ mà hoặc là hoàn thành tất cả hoặc hủy bỏ tất cả.

Một trạng thái cơ sở dữ liệu nhất quán là một trạng thái mà

tất cả các ràng buộc toàn vẹn được thỏa mãn.

Để đảm bảo tính nhất quán của cơ sở dữ liệu, mọi giao dịch phải bắt đầu với một cơ sở dữ liệu đang ở trạng thái nhất quán. Nếu cơ sở dữ liệu không ở trạng thái nhất quán, giao dịch sẽ mang lại một cơ sở dữ liệu không nhất quán. Điều này vi phạm các quy tắc của giao dịch và tính toàn vẹn dữ liệu. Với lý do này, tất cả các giao dịch phải được điều khiển và thực hiện bởi hệ quản trị cơ sở dữ liệu để đảm bảo tính toàn vẹn của cơ sở dữ liệu

Như đã nói ở trên, một giao dịch có thể hoàn thành hoặc không hoàn thành. Nếu giao dịch không hoàn thành được do một số nguyên nhân nào đó thì giao dịch đó phải được hủy bỏ. Để đảm bảo tính nguyên tố, khi giao dịch bị hủy bỏ nó phải đảm bảo không tác động đến CSDL. Vì vậy những tác động mà giao dịch bị

hủy bỏ đã làm với CSDL phải được tháo gỡ. Khi các tác động do một giao dịch bị hủy bỏ gây nên đã được tháo gỡ, ta nói rằng giao dịch đã được quay lui.

Giao dịch hoàn thành sự thực hiện của nó một cách thành công được gọi là giao dịch được chuyển giao. Những giao dịch này đã thực hiện các cập nhật biến đổi cơ sở dữ liệu đến một trạng thái toàn vẹn mới bền vững và chúng ta không thể gỡ bỏ các tác động của nó bằng cách hủy bỏ nó.

Tóm lại một giao dịch phải ở một trong các trạng thái sau: + Kích hoạt: Trạng thái giao dịch đang thực hiện

+ Chuyển giao bộ phận: Trạng thái sau khi chỉ thị cuối cùng của giao dịch được thực hiện xong

+ Thất bại: Trạng thái sau khi phát hiện ra sự thực hiện bình thường của giao dịch có thể không thực hiện được nữa.

+ Hủy bỏ: Trạng thái sau giao dịch khi đã được quay lui và CSDL đã được phục hồi về trạng thái của nó như trước khi giao dịch bắt đầu

+ Chuyển giao: Trạng thái sau khi giao dịch đã thực hiện hoàn thành.

Sơ đồ trạng thái của một giao dịch

Kích hoạt Chuyển giao bộ phận Thất bại Chuyển giao Hủy bỏ

5.3.4. Quản lý giao dịch với SQL

SQL cung cấp một số câu lệnh cho phép quản lý các giao dịch: - BEGIN TRANSACTION: Khai báo bắt đầu một giao dịch; - COMMIT: Xác định kết thúc giao dịch hay giao dịch được hoàn thành. Tại thời điểm COMMIT được gọi, giao dịch được xem như đã thực hiện thành công.

- ROLLBACK: Quay lui hay hủy bỏ giao dịch. Khi gặp câu lệnh này các sự thay đổi bởi các câu lệnh sau BEGIN TRANSACTION gần nhất được hủy bỏ.

Ví dụ: Chuyển số tiền X từ tài khoản A sang tài khoản B trong bảng TAIKHOAN.

BEGIN TRANSACTION; UPDATE TAIKHOAN SET Sodu = Sodu - X WHERE Sotaikhoan = A; UPDATE TAIKHOAN SET Sodu = Sodu + X WHERE Sotaikhoan = B; COMMIT;

5.4. ĐIỀU KHIỂN TƯƠNG TRANH

Điều khiển tương tranh là sự sắp xếp việc thực hiện đồng thời các giao dịch trong hệ quản trị cơ sở dữ liệu. Mục đích của điều khiển tương tranh là đảm bảo khả năng tuần tự của giao dịch trong môi trường cơ sở dữ liệu đa người dùng. Điều khiển tương tranh là cần thiết và quan trọng, bởi việc thực hiện đồng thời của các giao dịch trên cơ sở dữ liệu dùng chung có thể tạo ra một số vấn đề về tính nhất quán và toàn vẹn dữ liệu. Có ba vấn đề chính là: Cập nhật bị mất, dữ liệu chưa hoàn thành và tra cứu không nhất quán.

5.4.1. Cập nhật bị mất (Lost Updates)

Để minh hoạ cho vấn đề cập nhật bị mất, ta xem xét ví dụ sau: Giả sử tại một thời điểm có hai khách hàng A và B cùng thực hiện việc gửi tiền vào tài khoản X với số tiền tương ứng là 150$ và 200$. Số dư ban đầu của tài khoản X là 500$. Khi đó ta có hai giao dịch đồng thời T1 và T2 như sau:

Giao dch Tính toán

T1: khách hàng A gửi tiền Sodu = Sodu +150 T2: khách hàng B gửi tiền Sodu = Sodu +200

Một dãy các thao tác của các giao dịch được thực hiện theo thứ tự như sau luôn cho kết quả chính xác với Sodu = 850.

Thi gian

Giao dch Các thao tác Giá tr lưu tr

1 T1 Đọc Sodu 500 2 T1 Sodu = 500 + 150 3 T1 Ghi Sodu 650 4 T2 Đọc Sodu 650 5 T2 Sodu = 650 + 200 6 T2 Ghi Sodu 850

Giả sử giao dịch T2 tiến hành đọc giá trị Sodu khi giao dịch T1 chưa ghi giá trị mới lên đĩa. Như vậy T2 vẫn thao tác trên giá trị 500 và thực hiện cộng thêm 200. Trong lúc đó T1 thực hiện ghi giá trị 650 lên đĩa, ngay sau đó T2 ghi đè giá trị 700. Như vậy việc cộng thêm 150$ vào tài khoản sẽ "bị mất" trong quá trình xử lý. Quá trình được mô tả như sau:

Thi gian Giao dch Các thao tác Giá tr lưu tr

1 T1 Đọc Sodu 500 2 T2 Đọc Sodu 500 3 T1 Sodu = 500 + 150 4 T1 Ghi Sodu(cập nhật bị mất) 650 5 T2 Sodu = 500 + 200 6 T2 Ghi Sodu 700

5.4.2. Dữ liệu chưa hoàn thành (Uncommitted Data)

Dữ liệu chưa hoàn thành xảy ra khi 2 giao dịch T1 và T2 được thực hiện đồng thời và giao dịch T1 phải quay lui sau giao dịch T2 đã sẵn sàng truy cập dữ liệu chưa hoàn thành. Điều này vi phạm tính độc lập của giao dịch. Để minh hoạ khả năng này, chúng ta sử dụng 2 giao dịch như được mô tả ở phần trên. Tuy nhiên, tại thời điểm này giao dịch T1 phải quay lui với việc hủy bỏ việc cộng thêm 150$ vào tài khoản X.

Giao dch Tính toán

T1: khách hàng A gửi tiền Sodu = Sodu +150 Quay lui T2: khách hàng B gửi tiền Sodu = Sodu +200

Nếu thứ tự giao dịch được thực hiện như mô tả dưới đây thì kết quả luôn đúng.

Thi gian Giao dch Các thao tác Giá tr lưu tr

1 T1 Đọc Sodu 500 2 T1 Sodu = 500 + 150 3 T1 Ghi Sodu 650 4 T1 Quay lui 500 5 T2 Đọc Sodu 500 6 T2 Sodu = 500 + 200 7 T2 Ghi Sodu 700

Nhưng nếu Quay lui được thực hiện sau T2 thì làm xuất hiện vấn đề dữ liệu chưa được hoàn thành. Như được minh hoạ trong bảng sau:

Thi gian Giao dch Các thao tác Giá tr lưu tr

1 T1 Đọc Sodu 500 2 T1 Sodu = 500 + 150 3 T1 Ghi Sodu 650 4 T2 Đọc Sodu 650 5 T2 Sodu = 650 + 200 6 T1 Quay lui 500 7 T2 Ghi Sodu 850

5.4.3. Tra cứu không nhất quán (Inconsistent Retrieval)

Tra cứu không nhất quán xuất hiện khi một giao dịch thực hiện việc thống kê, tổng hợp dữ liệu dựa trên các hàm mẫu trong khi các giao dịch khác đang thực hiện cập nhật dữ liệu. Vấn đề là, giao dịch có thể đọc một số dữ liệu trước và sau khi chúng bị thay đổi giá trị, vì vậy kết quả đưa ra là không chính xác.

Để minh hoạ cho vấn đề này ta xem xét ví dụ sau:

- Giao dịch T1 thực hiện việc tính tổng số dư của các tài khoản tiền gửi,

- Tại cùng thời điểm, giao dịch T2 thực hiện việc chuyển 50$ từ tài khoản X sang tài khoản Y.

Hai giao dịch trên được thể hiện bởi các câu lệnh SQL như sau:

Giao dch T1 Giao dch T2

BEGIN TRANSACTION; SELECT SUM(Sodu)

FROM TAIKHOAN

UPDATE TAIKHOAN SET Sodu = Sodu - 50 WHERE Sotaikhoan = X UPDATE TAIKHOAN

SET Sodu = Sodu + 50 WHERE Sotaikhoan = Y COMMIT;

Giả sử giá trị ban đầu và giá trị sau khi cập nhật được phản ánh như sau :

Trước cp nht Sau cp nht

Sotaikhoan Sodu Sodu

O 100 100

X 200 (200-50) →→→→150 Y 150 (150+50)→→→→200

Z 200 200

Tình trạng tra cứu không nhất quán có thể xảy ra, nếu việc tra cứu T1 diễn ra đồng thời với giao dịch T2 như sau:

Thi gian Giao dch Hành động Giá trCng 1 T1 Đọc Sodu với Sotaikhoan = O 100 100 2 T2 Đọc Sodu với Sotaikhoan = X 200 3 T2 Sodu = 200 - 50

4 T2 Ghi Sodu với Sotaikhoan = X 150

5 T1 Đọc Sodu với Sotaikhoan = X 150 250 (sau) 6 T1 Đọc Sodu với Sotaikhoan = Y 150 400(trước) 7 T2 Đọc Sodu với Sotaikhoan = Y 150

8 T2 Sodu = 150 + 50

9 T2 GhiSodu với Sotaikhoan = Y 200 10 T2 Hoàn thành

11 T1 Đọc Sodu với Sotaikhoan = Z 200 600

Ta thấy rằng kết quả đưa ra (600) là không đúng, kết quả đúng phải là 650.

5.4.4. Xếp lịch

Chúng ta biết rằng một số vấn đề có thể xuất hiện khi 2 hay nhiều giao dịch cùng được thực hiện đồng thời; một giao dịch bao gồm một dãy thao tác vào/ra cần thiết để chuyển cơ sở dữ liệu từ trạng thái nhất quán này sang trạng thái nhất quán khác; cơ sở dữ liệu nhất quán chỉ được đảm bảo trước và sau khi thực hiện giao dịch. Một cơ sở dữ liệu luôn dịch chuyển qua trạng thái không nhất quán tạm thời khi thực hiện giao dịch. Trạng thái không nhất quán tạm thời này tồn tại vì máy tính không thể thực hiện 2 thao tác tại cùng một thời điểm, cho nên phải thực hiện chúng một cách tuần tự. Trong quá trình thực hiện, tính độc lập của các giao dịch

ngăn cấm các giao dịch khác truy cập đến dữ liệu của giao dịch đang được thực hiện.

Trong ví dụ trên ta đã xét cách thực hiện của các thao tác trong giao dịch một cách tuỳ tiện. Chỉ cần 2 giao dịch T1 và T2 truy cập dữ liệu không liên quan thì không xảy ra xung đột và thứ tự thực hiện sẽ không liên quan đến kết quả. Nhưng nếu các giao dịch thao tác trên các dữ liệu có liên quan, xung đột có thể xảy ra, và việc lựa chọn thứ tự thao tác là bài toán khó. Như vậy, làm thế nào để xác định đúng thứ tự thực hiện và ai xác định thứ tự đó? Rất may, các hệ quản trị cơ sở dữ liệu đã giải quyết vấn đề này bằng việc cài đặt sẵn modul xếp lịch.

Xếp lịch là sự sắp thứ tự thực hiện các thao tác sao cho các giao dịch đồng thời luôn đảm bảo khả năng tuần tự. Để xác định thứ tự chính xác, xếp lịch dựa vào các giải thuật điều khiển tương tranh, như: phương thức khóa hay nhãn thời gian.

5.4.5. Điều khiển tương tranh với phương thức khóa

Việc sử dụng khóa nhằm đảm bảo việc dành riêng việc sử dụng

mẫu tin cho giao dịch hiện tại. Nói một cách khác, giao dịch T2 không được truy cập đến mẫu tin mà hiện tại giao dịch T1 đang sử dụng. Một giao dịch dành được khóa ưu tiên để truy cập dữ liệu; khóa được giải phóng khi giao dịch được hoàn thành, để giao dịch khác có thể khóa mẫu tin cho việc sử dụng riêng của nó.

a) Khóa hạt (lock granularity)

Khóa hạt biểu thị các mức khóa. Việc khóa có thể xảy ra tại các mức sau: khóa cơ sở dữ liệu, khóa bảng, khóa dòng hay khóa thuộc tính.

* Mức khóa cơ sở dữ liệu

Với mức khóa cơ sở dữ liệu, toàn bộ cơ sở dữ liệu được khóa, do vậy ngăn cấm việc sử dụng các bảng trong cơ sở dữ liệu bởi giao dịch khác trong khi một giao dịch nào đó đang được thực hiện. Mức khóa này tốt cho việc xử lý theo khối, nhưng không thích hợp cho các hệ quản trị đa người dùng. Với mức khóa này

một giao dịch khác không thể truy cập vào cơ sở dữ liệu, mặc dù nó không hề thao tác trên dữ liệu liên quan đến giao dịch đang được thực hiện.

* Mức khóa bảng

Trong mức khóa bảng, toàn bộ bảng sẽ được khóa, do vậy ngăn cấm việc truy cập của giao dịch khác lên các mẫu tin của bảng trong khi một giao dich nào đó đang sử dụng bảng. Nếu giao dịch yêu cầu truy cập đến một số bảng, các bảng này sẽ bị khóa. Tuy nhiên các giao dịch khác có thể truy cập đến cơ sở dữ liệu nhưng trên các bảng khác.

Mức khóa này là tốt hơn so với mức khóa cơ sở dữ liệu, nếu có nhiều giao dịch truy cập đến các bảng khacs nhau của cơ sở dữ liệu. Thì mức khóa này sẽ làm giảm hiệu năng của hệ thống.

* Mức khóa dòng (khóa bản ghi)

Mức khóa dòng hiệu quả hơn nhiều so với các mức khóa trước. Hệ quản trị cơ sở dữ liệu cho phép các giao dịch đồng thời truy cập đến các dòng khác nhau của cùng một bảng.

* Mức khóa thuộc tính

Mức khóa thuộc tính cho phép các giao dịch đồng thời truy cập đến cùng một dòng nhưng trên các thuộc tính khác nhau.

b) Các kiểu khóa

* Khóa nhị phân

Khóa nhị phân có 2 trạng thái: Khóa (locked - 1) hay giải phóng khóa (unlocked - 0). Nếu một đối tượng (cơ sở dữ liệu, bảng, dòng, thuộc tính) bị khóa bởi một giao dịch, các giao dịch khác không thể sử dụng đối tượng này. Nếu đối tượng không bị khóa, bất kỳ một giao dịch nào cũng có thể khóa đối tượng để sử

Một phần của tài liệu Cơ sở dữ liệu (Trang 100)

Tải bản đầy đủ (PDF)

(121 trang)