You are on page 1of 4

BÀI TẬP HQTCSDL: GIAO TÁC VÀ TRUY CẬP ĐỒNG THỜI

1. Concurrency control
Tạo cơ sở dữ liệu account từ account.sql. Hãy thực hiện các tác vụ sau:
1.1. Tạo một transaction T, sau đó xem và thay đổi transaction isolation level của giao tác
với các lệnh:
begin transaction isolation level …;
show transaction isolation level;
set transaction isolation level …;

1.2. Tạo savepoint và sử dụng rollback với savepoint; kết thúc transaction T bằng lệnh
rollback.
1.3. Multi version concurrency control (MVCC) trong PostgreSQL
Transaction T1 Transaction T2
begin; begin;
show transaction isolation level; show transaction isolation level;
select count(*) from account;
insert into account (name,
balance) values (‘test’, 100);
select count(*) from account;
select count(*) from account;
rollback;
select count(*) from account;
rollback;

- Transaction isolation level trong của hai transaction là gì?


- Nhận xét kết quả của 3 lệnh SELECT của T2 so với lệnh SELECT của T1. Tại sao
có các kết quả này?
- Nếu thay rollback bằng commit trong T1, kết quả của các lệnh SELECT COUNT...
của T1 và T2 thay đổi như thế nào?
- Nếu chúng ta bỏ các lệnh liên quan đến transaction (begin, rollback, show
transaction...), kết quả các lệnh SELECT COUNT… thay đổi như thế nào?
1.4. Read uncommitted và read committed trong PostgreSQL
Thiết lập transaction isolation level của transaction T2 ở mức read uncommitted và thực hiện
lại hai transaction T1, T2 nói trên. Kết quả thực hiện có thay đổi như thế nào so với kết quả ở
phần 1.3? Hãy so sánh hai isolation level “read uncommitted” và “read committed” của
PostgreSQL.
1.5. Hãy tìm isolation level thấp nhất để các lệnh SELECT của transaction T4 cho kết quả
như nhau.
T3 T4
begin; begin;
select * from account where
update account set name = ‘Anh’ id=1;
where id=1;

commit; select * from account where


id=1;

select * from account where


id=1;
commit;

1.6. Hãy trả lời các câu hỏi tương tự như 1.5 cho transaction T6.
T5 T6
begin; begin;
select * from account where
insert into account (name, groupid=1;
groupid, balance) values (‘new’,
1, 100);
select * from account where
groupid=1;
commit; select * from account where
groupid=1;
commit;
select * from account where
groupid=1;

1.7. Giả sử hai transaction T7 và T8 có mã lệnh như sau:


T7 T8
begin; begin;
update account set balance=150 update account set balance=250
where id=1; where id=1;
commit; commit;

Hãy sửa mã lệnh của T7 và T8 để khi hai transaction này thực hiện đồng thời chỉ có một
transaction thành công.
1.8. Cho hai transaction T9 và T10 trong đó An và Bình chuyển tiền cho Cường.
T9 T10
begin; begin;
update account set balance=balance-10 update account set balance=balance-5
where id=1; where id=2;
update account set balance=balance+10 update account set balance=balance+5
where id=3; where id=3;
commit; commit;
Hãy tìm isolation level để T9 và T10 có thể thực hiện đồng thời với commit thành công.
1.9. Theo anh/chị, nên sử dụng T11 hay T12 để thực hiện giao dịch chuyển tiền từ một tài
khoản sang một tài khoản khác, tại sao?

T11 T12
begin;
update account set balance=balance-10 update account set balance=balance-10
where id=1; where id=1;
update account set balance=balance+10 update account set balance=balance+10
where id=3; where id=3;
commit;
1.10. Sử dụng pg_advisory_lock:
T13 T14
SELECT pg_advisory_lock(10); SELECT pg_advisory_lock(11);
… …
SELECT pg_advisory_lock(11); SELECT pg_advisory_lock(10);
… …
SELECT pg_advisory_unlock(11); SELECT pg_advisory_unlock(10);
SELECT pg_advisory_unlock(10); SELECT pg_advisory_unlock(11);
Hãy mô tả hiện tượng xảy ra với hai transaction T13, T14 và giải thích nguyên nhân.
2. Backup and restore
2.1. Cho trước 20 tapes. Hãy lập lịch backup theo Grand-Father-Son bắt đầu từ tháng 3/2024.
2.2. Cho trước 5 tapes A, B, C, D, E. Hãy lập lịch backup theo Hanoi Tower bắt đầu từ tháng
3/2024 với tần suất 1 lần/1 ngày.
2.3. Hãy sử dụng công cụ pg_dump, backup cơ sở dữ liệu account ban đầu (có 10 bản ghi)
khi không có transaction update/insert nào được thực hiện trong CSDL đó. Sau đó
restore bản backup này với hai trường hợp sau và nhận xét:
- Không xóa nội dung tất cả các bảng trong cơ sở dữ liệu account hiện tại
- Xóa tất cả các bảng trong cơ sở dữ liệu account hiện tại
2.4. Hãy sử dụng công cụ pg_dump, backup cơ sở dữ liệu account ban đầu. Khi bắt đầu thực
hiện pg_dump, có một transaction đã thực hiện xong câu lệnh UPDATE để thay đổi tên
của An thành Anh, nhưng chưa commit. Khi pg_dump kết thúc, chúng ta có bản
backup1, đồng thời transaction cập nhật nói trên kết thúc. Tiếp tục thực hiện pg_dump
để tạo bản backup2, với giả định không có transaction nào hoạt động trên CSDL. Hãy so
sánh nội dung của backup1 và backup2.
2.5. Point-in-time restore (PITR):
- Hãy tạo một cơ sở dữ liệu đặt tên là Maven từ file
MavenMarket_Transactions_1997.csv.
- Sau đó, thiết lập chế độ continuous archiving cho Maven.
- Khi đã thiết lập thành công continuous archiving cho Maven, tiếp tục insert các dòng
mới từ file MavenMarket_Transactions_1998.csv vào Maven bằng một chương trình
P.
- Ghi lại thời gian bắt đầu t s và kết thúc te của chương trình P.
- Hãy khôi phục CSDL Maven ở một thời điểm t 0 bất kỳ nằm giữa ts và te. Có thể khôi
phục Maven theo kiểu PITR tại một thời điểm bất kỳ trước t s được không? Tại sao?

You might also like