Chương 8
GV Phi Loan - FIT - UIH
1
Nội dung
• Transaction là gì? • Tính chất của Transaction • Thực thi transaction tường minh • Bài toán đồng thời và cơ chế quản l{ khóa
– Các loại khóa – Cơ chế quản l{ khóa – Giải quyết tình huống nghẽn khóa
GV Phi Loan - FIT - UIH
2
Khái quát về Transaction
• A transaction is a sequence of operations performed as a single logical unit of work. • Nếu 1 transaction thành công, tất cả các chỉnh
sửa dữ liệu trong transaction đó sẽ được công nhận (commit). Nếu có lỗi khi thực thi transaction, tất cả mọi sửa đổi dữ liệu sẽ bị xóa và CSDL trở về lại tình trạng ban đầu trước khi thực thi transaction đó.
GV Phi Loan - FIT - UIH
3
Bốn thuộc tính cơ bản (ACID) của transaction • Tính nguyên tố (Atomicity): một transaction phải là 1 đơn vị công việc nguyên tử; hoặc tất cả các sửa đổi dữ liệu đều được thực thi hoặc không 1 sửa đổi nào được thực thi.
• Tính nhất quán (Consistency): một giao tác phải chuyển CSDL từ trạng thái nhất quán này sang trạng thái nhất quán khác.
• Tính cô lập (Isolation) : Những chỉnh sửa được làm bởi transaction hiện hành phải được cô lập khỏi những chỉnh sửa được làm bởi các transaction hiện hành khác.
• Tính bền vững (Durability): những thay đổi của
CSDL do giao tác thực hiện thành công là bền vững, không bị mất đi kể cả khi có lỗi xảy ra sau đó.
GV Phi Loan - FIT - UIH
4
Phân loại Transaction
• Giao tác tường minh (explicit transaction): được khai
báo bằng lệnh BEGIN TRANSACTION
• Giao tác ngầm định (implicit transaction): giao tác
mới sẽ tự động bắt đầu ngay khi giao tác trước đó hoàn
tất, nhưng mỗi transaction được kết thúc tường minh bằng
lệnh COMMIT hay ROLLBACK
• Giao tác tự động chuyển giao (autocommit
transaction): mỗi một lệnh được xem như 1 transaction.
GV Phi Loan - FIT - UIH
5
Transaction trong SQL server
• Để hoàn thành các yêu cầu của 4 tính chất
ACID trên, SQL Server cung cấp các chức năng sau: – Quản lý Transaction (Transaction
management)
– Quản l{ Khoá (Locking Management) – Ghi nhật ký (Logging)
GV Phi Loan - FIT - UIH
6
QUẢN LÝ TRANSACTION
GV Phi Loan - FIT - UIH
7
Định nghĩa transaction tường minh
• BEGIN TRAN[SACTION] [transaction_name] Dùng để đánh dấu việc bắt đầu của 1
transaction
• COMMIT [TRAN[SACTION]
[transaction_name]
Hay COMMIT WORK Dùng để đánh dấu việc kết thúc của 1
transaction tường minh
GV Phi Loan - FIT - UIH
8
Ví dụ
GV Phi Loan - FIT - UIH
9
Làm thế nào để quay về lại trước những thay đổi
ROLLBACK [TRAN[SACTION] [transaction_name |savepoint_name ]
Dùng để quay ngược một transaction tường
minh hay ngầm định về lại điểm bắt đầu, hay về điểm dừng (save-point) bên trong 1 transaction
GV Phi Loan - FIT - UIH
10
Ví dụ BEGIN TRANSACTION
USE Pubs UPDATE Titles SET Royalty = Royalty + 20 WHERE type LIKE 'busin%' IF (SELECT MAX(Royalty) FROM Titles WHERE Type LIKE 'busin%') >$25 BEGIN
ROLLBACK TRANSACTION PRINT 'Transaction Rolled back'
END ELSE BEGIN
COMMIT TRANSACTION PRINT 'Transaction Committed'
END GV Phi Loan - FIT - UIH
11
Tạo điểm dừng cho 1 TRANSACTION
• Lệnh SAVE TRANSACTION dùng để đặt 1 điểm dừng (save point) bên trong 1 transaction. Điểm dừng chia transaction thành 1 các phần khác nhau sao cho transaction có thể quay về lại điểm dừng này nếu 1 phần của transaction bị loại bỏ có điều kiện.
• Cú pháp
SAVE TRAN[SACTION] {savepoint_name }
GV Phi Loan - FIT - UIH
12
Thực thi một transaction với điểm dừng BEGIN TRANSACTION UPDATE Employee SET cCurrentPosition = '0015' WHERE cEmployeeCode = '000002‘ UPDATE Position SET iCurrentStrength = iCurrentStrength + 1 WHERE cPositionCode = '0015' SAVE TRANSACTION trnTransaction1
UPDATE Requisition SET siNoOfVacancy=siNoOfVacancy - 10 WHERE cRequisitionCode='000004'
UPDATE Position SET iCurrentStrength=iCurrentStrength+10 WHERE cPositionCode='0015‘
GV Phi Loan - FIT - UIH
13
Thực thi một transaction với điểm dừng
IF (SELECT iBudgetedStrength-iCurrentStrength FROM Position WHERE cPositionCode = '0015') <0
BEGIN
PRINT 'Transaction 1 has been committed but transaction 2 has not been committed.' ROLLBACK TRANSACTION trnTransaction1
END
ELSE
BEGIN
PRINT 'Both the transactions have been committed.' COMMIT TRANSACTION
END
GV Phi Loan - FIT - UIH
14
Ví dụ: dùng transaction và cơ chế quản lý lỗi BEGIN TRY;
BEGIN TRANSACTION;
UPDATE Production.ProductInventory SET Quantity -= 100 WHERE ProductID = 527
AND LocationID = 6 -- misc storage AND Shelf = ‘B’ AND Bin = 4;
UPDATE Production.ProductInventory SET Quantity += 100 WHERE ProductID = 527 AND LocationID = 50 AND Shelf = ‘F’ AND Bin = 11;
COMMIT TRANSACTION;
GV Phi Loan - FIT - UIH
15
Ví dụ: dùng transaction và cơ chế quản lý lỗi END TRY BEGIN CATCH;
ROLLBACK TRANSACTION; RAISERROR(’Inventory Transaction Error’, 16, 1); RETURN;
END CATCH;
GV Phi Loan - FIT - UIH
16
Hàm XACT_STATE()
• Chỉ ra yêu cầu đang chạy hiện thời có transaction
người dùng nào đang hoạt động không và transaction đó có thể được commit hay không?
1
Yêu cầu hiện thời có 1 transaction người dùng đang hoạt động có thể commit được Không có transaction nào đang hoạt động
0 -1 Yêu cầu hiện thời có 1 transaction người dùng đang hoạt
động nhưng có lỗi nên transaction được xem là uncommittable, không thể commit hay rollback về điểm dừng . Yêu cầu không thể “write” được chon đến khi transaction được rollback hoàn toàn.
GV Phi Loan - FIT - UIH
17
Ví dụ hàm Xact_State() BEGIN TRY
BEGIN TRANSACTION;
DELETE FROM Production.Product
WHERE ProductID = 980;
COMMIT TRANSACTION;
END TRY BEGIN CATCH
IF (XACT_STATE()) = -1 BEGIN
PRINT 'The transaction is in an uncommittable
state.‘ + ' Rolling back transaction.'
ROLLBACK TRANSACTION;
END;
GV Phi Loan - FIT - UIH
18
Ví dụ hàm Xact_State()
IF (XACT_STATE()) = 1
BEGIN
PRINT 'The transaction is committable.' +
‘ Committing transaction.'
COMMIT TRANSACTION;
END;
END CATCH; GO
GV Phi Loan - FIT - UIH
19
Các lệnh không hợp lệ trong transaction
• Rollback phải có khả năng “undo”, vì vậy các
lệnh sau không được dùng: – CREATE DATABASE, ALTER DATABASE – CREATE TABLE, ALTER TABLE, TRUNCATE TABLE – CREATE INDEX – Tất cả lệnh DROP – SELECT...INTO – GRANT or REVOKE – DISK INIT, RECONFIGURE, LOAD DATABASE,
LOAD TRANSACTION
GV Phi Loan - FIT - UIH
20
QUẢN LÝ KHÓA
SQL Server uses a dynamic, cooperative locking mechanism to protect the consistency of the data in the database.
GV Phi Loan - FIT - UIH
21
Nội dung
• Các mode khóa – Khóa Intent
• Tương thích giữa các khóa
GV Phi Loan - FIT - UIH
22
Transaction và cơ chế khóa
• Trước khi transaction đọc hay chỉnh sửa dữ liệu, nó cần được bảo vệ tránh ảnh hưởng của các transaction khác đang chỉnh sửa cùng dữ liệu.
• Transaction yêu cầu khóa trên dữ liệu đang
dùng.
• Có nhiều mode khóa khác nhau phụ thuộc vào mức độ phụ thuộc dữ liệu của transaction.
GV Phi Loan - FIT - UIH
23
Transaction và cơ chế khóa
• Nếu transaction yêu cầu 1 mode khóa xung đột Database Engine sẽ bắt transaction này dừng (pause) cho đến khi khóa trước đó được giải phóng.
• Tất cả các khóa sẽ được giải phóng khi
transaction hoàn thành (bằng commit hay roll back)
GV Phi Loan - FIT - UIH
24
GV Phi Loan - FIT - UIH
25
Lock Granularity and Hierarchies
• Multigranular locking : cho phép khóa các tài nguyên trong 1 transaction ở các mức khác nhau. – Mục đích: giảm thiểu chi phí khóa.
• Khóa ở mức nhỏ hơn như mức row sẽ làm tăng tính đồng thời nhưng tăng chi phí vì cần nhiều khóa nếu có nhiều hàng cần khóa.
• Khóa ở mức cao hơn như mức table, sẽ hạn chế truy xuất đến các phần khác của bảng mà transaction hiện hành không dùng đến, nhưng giảm được chi phí.
GV Phi Loan - FIT - UIH
26
Các mode khóa
GV Phi Loan - FIT - UIH
27
Intent locks
• SQL Server không chỉ khóa theo yêu cầu
mà còn thông báo intent của khóa ở mức cao hơn.
• Xét 2 transaction: T1 và T2, mỗi
transaction sẽ modify các hàng khác nhau. Để modify 1 hàng, SQL Server cần phải thực hiện khóa exclusive trên hàng có { định modify.
GV Phi Loan - FIT - UIH
28
Intent locks
• Nếu SQL Server chỉ thực hiện 2 khóa
exclusive cho T1 trên R1 và T2 trên R2, SQL Server sẽ phải khảo sát cả cấu trúc cây để xác định hàng nào bị khóa? Để giảm chi phí SQL Server sẽ tuyến bố intent của nó lên mức cao hơn của cây bằng cách đặt khóa intent các hàng phía trên và ngược về gốc.
GV Phi Loan - FIT - UIH
29
GV Phi Loan - FIT - UIH
30
Intent locks
• Bằng cách khảo sát khóa intent, SQL
Server có thể nhanh chóng xác định là hiện có 1 intent-exclusive lock trên bảng nhưng các hàng T1 nằm ở phần khác của cây, nên SQL Server có thể vẫn có được khóa mà T2 yêu cầu.
GV Phi Loan - FIT - UIH
31
Sự tương thích khóa Lock compatibility • Tương thích khóa dùng để kiểm soát các transaction có chiếm các khóa trên cùng tài nguyên cùng lúc hay không?
• Nếu tài nguyên đã bị khóa bởi 1 transaction, một yêu cầu khóa mới được cấp chỉ khi mode của khóa được yêu cầu tương thích với mode của khóa hiện có. – Nếu không tương thích với khóa hiện có,
transaction yêu cầu khóa mới sẽ đợi cho đến khi khóa hiện tại được giải phóng hay hết thời gian đợi.
GV Phi Loan - FIT - UIH
32
Sự tương thích khóa Lock compatibility
• Không có mode khoá nào tương thích với
khóa exclusive (X). Trong khi đang có khóa X thì không transaction nào có thể chiếm được bất kz loại khóa nào (trên tài nguyên đó cho đến khi khóa X được giải phóng.
GV Phi Loan - FIT - UIH
33
Sự tương thích khóa Lock compatibility
• Nếu khóa shared (S) đang được dùng trên 1
tài nguyên, các transaction khác có thể chiếm các khóa shared hay khóa update (U) ngay trên tài nguyên đó ngay cả khi transaction đầu chưa hoàn tất. Tuy nhiên các transaction không thể có được khóa exclusive cho đến khi khóa shared được giải phóng
GV Phi Loan - FIT - UIH
34
Lock Compatibility Matrix
GV Phi Loan - FIT - UIH
35
Quiz
• Nếu transaction T1 hiện đang giữ khóa
update (U) trên 1 hàng. Transaction T2 yêu cầu cấp khóa shared ngay trên hàng đó. T2 có được cấp khóa không???
• Tại sao khóa IX hiện hành có thể tích hợp
được với 1 khóa IX khác?? – Because the intent locks are never held at the actual resource level ; they are at least one level above in the tree.
GV Phi Loan - FIT - UIH
36
Concurrency Effects
Các bài toán đồng thời
GV Phi Loan - FIT - UIH
37
Tính cô lập và bài toán đồng thời Isolation and Concurrency Problems
• Khi người dùng truy xuất tài nguyên cùng lúc thì được gọi là truy xuất tài nguyên đồng thời (resource concurrently).
• Do dữ liệu bị truy xuất đồng thời nên cần có
cơ chế bảo vệ khi nhiều người dùng cùng sửa đổi tài nguyên.
GV Phi Loan - FIT - UIH
38
Dynamic Lock Management
• SQL Server sử dụng cơ chế quản l{ khóa động để tăng tính đồng thời trong CSDL. – Nếu transaction chỉnh sửa 1 hàng trong bảng, SQL Server sẽ cấp 1 lock hàng (row lock).
– Nếu bảng có nhiều khóa hàng, SQL server sẽ
cấp khóa bảng hay khóa trang thay thế.
GV Phi Loan - FIT - UIH
39
Các mức cô lập transaction (transaction isolation level) • Nên chọn mức cô lập cho transaction không làm ảnh hưởng đến các khóa đang có để tránh dữ liệu bị sửa đổi.
• Một transaction luôn nhận khóa độc quyền trên bất kz dữ liệu nào mà nó sửa đổi và sẽ giữ khóa cho đến khi transaction hoàn tất.
• Mức cô lập càng thấp thì người dùng càng có nhiều khả năng truy xuất dữ liệu đồng thời, nhưng cũng gây ra nhiều ảnh hưởng tương tranh và ngược lại..
GV Phi Loan - FIT - UIH
40
Các mức cô lập
• Để chọn mức cô lập thích hợp thì phải cân đối giữa yêu cầu bảo toàn dữ liệu của ứng dụng với chi phí của mỗi mức cô lập. • Mức cô lập cao nhất là tuần tự hóa
(serializable)
• Mức cô lập thấp nhất là cho phép đọc dữ liệu
chưa được commit (read uncommitted).
GV Phi Loan - FIT - UIH
4 1
Bốn mức cô lập theo chuẩn ISO
1. Read uncommitted: mức thấp nhất, transaction bị cô lập chỉ đủ để bảo đảm các dữ liệu bị lỗi vật lý không được đọc mà thôi
2. Read committed: mức mặc định của Database
Engine
3. Repeatable read 4. Serializable: mức cao nhất, các transaction hoàn
toàn bị cô lập khỏi các transaction khác
GV Phi Loan - FIT - UIH
42
Các mức cô lập của SQL server DB Engine
1. READ UNCOMMITTED: các lệnh có thể đọc các hàng bị chỉnh sửa bởi các transaction khác dù chưa được commit
2. READ COMMITTED: các lệnh không thể đọc dữ liệu
đã bị sửa đổi nhưng chưa commit bởi các transaction khác.
3. REPEATABLE READ: các lệnh không thể đọc dữ liệu đã bị sửa đổi bởi các transaction khác và không có transaction nào có thể sửa đổi dữ liệu đã được đọc bởi transaction hiện hành cho đến khi transaction hiện hành hoàn tất.
GV Phi Loan - FIT - UIH
43
Các mức cô lập của SQL server DB Engine
4. SNAPSHOT: dữ liệu được đọc bởi bất kz lệnh nào trong 1 transaction thì sẽ đuợc giữ giống như lúc bắt đầu transaction.
5. SERIALIZABLE
GV Phi Loan - FIT - UIH
44
Các mức cô lập và ảnh hưởng của tính đồng thời
GV Phi Loan - FIT - UIH
45
Nonstandard Isolation Level: snapshot
• Có thể cải tiến tính đồng thời và có đặc tính tương tự như mức serializable. – Dữ liệu được đọc bởi 1 lệnh trong
transaction sẽ ở trạng thái giống như lúc bắt đầu transaction.
– The statements in a transaction get a snapshot of the committed data as it existed at the start of the transaction
GV Phi Loan - FIT - UIH
46
Nonstandard Isolation Level
• Để sử dụng mức isolation này, cần phải
thay đổi tùy chọn của database để có thể dùng thêm tài nguyên trong tempdb. • Khi bắt đầu transaction, phải xác định
snapshot isolation level.
GV Phi Loan - FIT - UIH
47
Ví dụ
USE [AdventureWorks2008] GO ALTER DATABASE AdventureWorks2008
SET ALLOW_SNAPSHOT_ISOLATION ON
GO SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; GO BEGIN TRANSACTION
SELECT * FROM HumanResources.EmployeePayHistory; SELECT * FROM HumanResources.Department;
GO COMMIT TRANSACTION; GO
GV Phi Loan - FIT - UIH
48
Lock Duration by Transaction Isolation Level
GV Phi Loan - FIT - UIH
49
Cách sử dụng khóa
• Mặc định của transaction isolation là read
committed, có nghĩa là SQL Server bảo đảm là chỉ có dữ liệu nào đã commit thì mới được đọc. Trong khi 1 hàng đang được cập nhật, dữ liệu chưa được commit, SQL Server sẽ buộc các transactions muốn đọc dữ liệu phải đợi, cho đến khi dữ liệu được commit.
GV Phi Loan - FIT - UIH
50
Ví dụ về sử dụng khoá
• User1 đang thực hiện các lệnh sau để cập nhật điểm
và ngày thi cho ứng viên có mã là ‘000002’ trong bảng ExternalCandidate. BEGIN TRANSACTION
UPDATE ExternalCandidate SET siTestScore = 90 WHERE cCandidateCode='000002' UPDATE ExternalCandidate SET dTestDate = getdate() WHERE cCandidateCode = '000002'
GV Phi Loan - FIT - UIH
51
Ví dụ về sử dụng khoá
• Trong khi transaction trên đang thực hiện, User2 muốn lập lịch phỏng vấn cho các ứng viên, nhưng không thể xem chi tiết của các ứng viên có điểm thi trên 80. User2 đang sử dụng các lệnh sau : BEGIN TRANSACTION
SELECT * from ExternalCandidate WHERE siTestScore > 80 UPDATE ExternalCandidate SET dInterviewDate = getdate()+ 2 WHERE siTestScore > 80
Hãy xác định tại sao user2 không thể thực thi transaction
GV Phi Loan - FIT - UIH
52
Ví dụ về sử dụng khoá
• Các bảng sẽ bị khoá khi transaction trên máy 1
đang thực hiện.
• Khi transaction trên máy 1 kết thúc bằng cách
dùng lệnh sau: COMMIT TRANSACTION
Thì transaction trên máy 2 mới được thực hiện.
GV Phi Loan - FIT - UIH
53
Lệnh DBCC USEROPTIONS statement
• Để xác định mức cô lập hiện hành, dùng lệnh DBCC
USEROPTIONS
USE AdventureWorks; GO SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; GO DBCC USEROPTIONS; GO
GV Phi Loan - FIT - UIH
54
Phạm vi của mức cô lập
• Khi mức cô lập được xác định, khóa dùng tất cả lệnh DML trong phiên làm việc đó sẽ theo mức co lập này.
• Mức cô lập này duy trì cho đến khi phiên làm việc kết thúc hay mức cô lập được cài đặt mức mới.
GV Phi Loan - FIT - UIH
55
Lệnh thay đổi mức cô lập
SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SNAPSHOT | SERIALIZABLE
}
[ ; ]
GV Phi Loan - FIT - UIH
5 6
Ví dụ
SET TRANSACTION ISOLATION LEVEL
REPEATABLE READ
GO BEGIN TRANSACTION SELECT * FROM publishers SELECT * FROM authors ... COMMIT TRANSACTION
GV Phi Loan - FIT - UIH
57
Nghẽn khóa - Deadlock
• A deadlock occurs when two or more tasks
permanently block each other because each task has a lock on a resource that the other task(s) are trying to lock
• Deadlock còn được gọi là deadly embrace
GV Phi Loan - FIT - UIH
58
Deadlocks
• Khi bị nghẽn khóa, các CTUD không thể giải
quyết bế tắc này mà DBMS phải phát hiện và giải quyết nghẽn khóa. – Chỉ có 1 cách là hủy bỏ một hay nhiều giao tác để
giải quyết bế tắc.
– Người dùng không nhận thấy được sự xuất hiện của tình trạng nghẽn khóa, DBMS phải tự động giải quyết tình trạng nghẽn khóa
GV Phi Loan - FIT - UIH
59
Phân loại deadlock
• Conversion • Writer-writer • Reader-writer (thường xuyên nhất) • Cascading.
GV Phi Loan - FIT - UIH
60
Phân loại deadlock
• Conversion deadlocks xảy ra khi cả 2 kết nối đều đang giữ khóa shared chung trên 1 tài nguyên và cả hai đang cố chuyển thành khóa exclusive lock cho riêng mình.
• Writer-writer deadlocks do tài nguyên yêu cầu để bảo đảm tất cả mã truy xuất tài nguyên phải theo đúng thứ tự
• Reader-writer deadlocks xảy ra khi 2 kết nối
đêu giữ khóa exclusive locks trên các tài nguyên khác nhau và kết nối này yêu cầu khóa shared trên tài nguyên của kết nối kia
GV Phi Loan - FIT - UIH
61
Phân loại deadlock
• Cascading deadlocks xảy ra khi có nhiều hơn 2 kết nối liên quan đến deadlock. – Ngay cả khi SQL Server chọn 1 victim cho deadlock, các deadlock khác vẫn đang tồn tại. SQL Server lại tiếp tục chọn victim khác cho đến khi tất cả deadlock đều được giải quyết.
GV Phi Loan - FIT - UIH
62
Cách giải quyết deadlock
• SQL Server dành riêng 1 thread chỉ đề dò tìm
deadlock.
• Mặc định thread này hoạt động sau mỗi 5 second. Nếu phát hiện có deadlock, thread hoạt động thường xuyên hơn, trường hợp nếu có nhiều deadlock, thread sẽ hoạt động sau mỗi 100 milliseconds.
GV Phi Loan - FIT - UIH
63
Cách giải quyết deadlock
• Khi có deadlock, 1 trong các process được
chọn bởi deadlock monitor sẽ bị kết thúc và rollback. – Process được chọn được gọi là deadlock
victim.
– Deadlock victim thường là process phát ra ít
transaction log record nhất.
• Có thể thay đổi mặc định này bằng cách thay đổi DEADLOCK_PRIORITY trên kết nối có liên quan đến.
GV Phi Loan - FIT - UIH
64