Tải bản đầy đủ (.docx) (21 trang)

TRANSACTION

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 (171.81 KB, 21 trang )

TRANSACTION
I.GIỚI THIỆU VỀ GIAO DỊCH TRONG SQL SERVER 7.0 :
I.1. Đònh nghóa :
Transaction là một đơn vò tính toán nhất quán và tin cậy . Một đơn vò luận lý phải đưa ra
4 lợi điểm ,được gọi là ACDI :tính nguyên tố (Atomicity) , tính nhất quán (Consistency) ,tính
tách biệt (Isolation) , tính bền (Durability) . Đây là điểm khác biệt giữa một query và một giao
dòch. Với query , hoàn toàn không có chú ý nào liên quan đến sự nhất quán và tin cậy.
I.2.Các thuộc tính của giao dòch :
• Atomicity : Một giao dòch phải đảm bảo là một đơn vò nguyên tố của công việc ;
Hoặc là tất cả hoặc là không có bất kỳ giao dòch nào được thực hiện .Tính nguyên tố
đòi hỏi nếu một giao dòch bò ngắt do sự cố thì các kết quả bộ phận của nó sẽ bò hủy
bỏ (undo).
• Consistency : khi một giao dòch hoàn thành , giao dòch phải đảm bảo tất cảdữ liệu
trong trạng thái nhất quán . Trong cơ sở dữ liệu quan hệ , tất cả các qui tắc phải
được ứng dụng vào sự sửa đổi của giao dòch để đảm bảo sự toàn vẹn dữ liệu .
• Isolation : Một giao dòch chưa hoàn thành không thể đưa kết quảcho giao dòch khác
trước khi nó hoàn tất . Sự thay đổi được tạo ra từ những giao dòch đồng thời phải
được tách biệt với những sửa đổi của những giao dòch đồng thời khác . Một giao
dòch có thể đọc dữ liệu trứơc khi một giao dòch đồng thời khác sửa đổi nó , hay là
nó đọc dữ liệu sau khi giao dòch thứ hai hoàn thành .
• Durability: Sau khi giao dòch hoàn thành , hệ thống phải đảm bảo là kết quả của
các tác vụ của nó không bao giờ bò mất, không bò lệ thuộc vào sự cố sau đó . Sự
thay đổi này vẫn còn giữ nguyên ngay cả có sự cố làm hệ thống gặp sự cố (fail) .
II. VIỆC CHỈ RÕ VÀ RÀNG BUỘC TRANSACTION TRONG SQL SERVER 7.0:
Người lập trình SQL có trách nhiệm khởi động và kết thúc giao dòch để thực thi tính
nhất quán luận lý của dữ liệu . Người lập trình phải đònh nghóa sự tuần tự của sự thay đổi dữ
liệu để dữ liệu luôn ở trạng thái nhatá quán . Người lập trình gom những tác vụ chỉnh sửa vào
một giao dòch đơn lẻ để SQL Server có thể đảm bảo sự toàn vẹn vật lý của giao dòch . Đó là
thuộc trách nhiệm của hệ thống enterprise database (SQL Server) ,hệ thống cung cấp những
kỹ thuật đảm bảo sự toàn vẹn vật lý của mỗi giao dòch , SQL Server cung cấp những dòch vụ :
• Tiện ích khóa(Locking facilities ) :dùng để đảm sự tách biệt (isolation) của giao dòch .


• Tiện ích Log (Logging facilities) : đảm bảo tính bền của giao dòch . Thậm chí server phục
vụ phầm cứng , hệ điều hành , hay SQL Server bò sự cố , SQL Server sử dụng những
phương pháp transaction log (một file cơ sở dữ liệu mà tất cả sự thay dữ liệu sẽ được ghi
vào , nó được sử dụng khi SQL Server tự động khôi phục) , để khởi động lại hay roll back tự
động bất cứ giao dòch nào chưa hoàn tất khi hệ thống bò sự cố .
• Quản lý giao dòch có đặc điểm là đảm bảo tính nguyên tố và nhấn quán đối với giao dòch .
Sau khi một giao dòch khởi động , nó phải được hoàn thành một cách tốt đẹp hay SQL
Server hủy tất cả những sự thay đổi dữ liệu được tạo ra từ lúc giao dòch phát sinh .
II.1. Quá trình quản lý giao dòch :
Ứng dụng điều khiển các giao dòch bằng cách chỉ ra khi nào nó khởi động hay kết thúc .
Điều này được chỉ rõ bằng việc sử dụng lệnh Transac-SQL hay hàm của database API . Hệ
thống phải có công cụ báo lỗi một cách đúng đắn để hủy bỏ giao dòch trước khi nó hoàn thành .
Một giao dòch sẽ được quản lý ở mức kết nối của mỗi SQL Server . Khi một giao dòch
được khởi động trong một kết nối , tất cả các lệnh Transac-SQL được thực thi trong kết nối đó
sẽ là một phần của giao dòch cho đến khi giao dòch đó kết thúc .
II.1.1 .Khởi động một giao dòch :
Được chia làm 3 loại :
• Explicit (rõ ràng) : để khởi động giao dòch loại này dùng lệnh BEGIN
TRANSACTION .
• Autocommit (tự động) :SQL Server tự thiết lập kiểu này. Mỗi một tác vụ
Transaction-SQL được commit khi nó hoàn thành mà không chỉ ra bất cứ
trạng thái điều khiển giao dòch .
• Implicit (ngầm) :có thể thiết lập kiểu giao dòch ngầm cả trong API hay
Transac-SQL : SET IMPLICIT_TRANSACTION ON . Lệnh kế tiếp khởi
động tự động một giao dòch mới . Khi một giao đó hoàn thành , lệnh kế tiếp
được xem như khởi động một giao dòch mới .
Nếu một kết nối thay đổi từ một kiểu giao dòch này sang dạng giao dòch
khác , nó không ảnh hưởng vào mode giao dòch của bất kì sự kết nối khác .
II.1.2. Kết thúc một giao dòch :
Để kết thúc giao dòch có thể dùng COMMIT hay ROLLBACK.

• COMMIT : Nếu một giao dòch thành công thì commit nó .Lệnh COMMIT
đảm bảo tất cả sự thay đổi của giao dòch được tạo ra là một phần vónh cữu
của database . Lệnh COMMIT cũng giải phóng tài nguyên được dùng trong
quá trình thực hiện giao dòch .
• ROOLBACK : Nếu một lỗi xuất hiện trong giao dòch hay user quyết đònh hủy
bỏ giao dòch thì giao dòch được roll back . Lệnh ROLLBACK khôi phục lại
những gì đã sửa đổi tạo ra trong giao dòch và đưa nó về trạng thái lúc giao
dòch bắt đầu khởi động . Lệnh này cũng giải phóng tài nguyên do giao dòch
giữ .
II.1.3. Những lỗi xuất hiện trong quá trình thực thi giao dòch:
Nếu lỗi server ngăn cản sự hoàn thành của giao dòch , SQL Server tự động roll
back giao dòch và giải phóng tất cả tài nguyên được giữ bởi giao dòch . Nếu sự kết nối
mạng giữa client đến SQL Server bò hỏng thì bất kỳ giao dòch nào đang giải quyết trên
kết nối đó đều bò roll back khi mạng báo cho SQL Server về sự hỏng hóc đó. Nếu ứng
dụng client hay client shut down hay được khởi động lại,điều này cũng dẫn đến sự hủy
kết nối và SQL Server roll back bất cứ kết nối nào đang làm việc ngay khi mạng thông
báo cho nó biết . Nếu client ra khỏi ứng dụng thì tất cả giao dòch đều bò roll back.
Nếu lỗi của tác vụ là run-time xuất hiện như vi phạm ràng buộc , thì đáp ứng
mặc đònh trong SQL là roll back chỉ lệnh nào xuất hiện lỗi (SET XACT_ABORT) . Sau
khi SET XACT_ABORT ON, các lỗi run-time gây ra sự roll back tự động đối với giao
dòch hiện thời . Lỗi biên dòch như lỗi syntax không bò ảnh hưởng bởi SET
XACT_ABORT .
Nhiệm vụ của người lập trình là viết code cho ứng dụng để chỉ rõ tác vụ đúng
(COMMIT hay ABORT) nếu xuất hiện lỗi run-time hay biên dòch .
II.2. Loại giao dòch Explicit :
Explicit Transaction là giao dòch mà user dònh nghóa một cách rõ ràng cả quá trình khởi
động lẫn kết thúc giao dòch . Explicit Transaction cũng được gọi bởi giao dòch user_defined hay
user_specified trong các version của SQL Server .
• Ứng dụng DB_library và Transact_SQL script : BEGIN TRANSACTION , COMMIT
TRANSACTION , COMMIT WORK , ROLLBACK TRANSACTION hay

ROLLBACK WORK .
• Ứng dụng OLE DB :ItransactionLocal::StartTransaction ,
ITransaction::Commit hay ITransaction::Abort .
• Ứng dụng ADO : Begin Transaction Commit hay Transaction Rollback trong đối
tương Conection .
• Ứng dụng ODBC API : không hỗ trợ explicit transaction chỉ hỗ trợ autocommit hay
implitcit transaction .
II.3. Loại giao dòch Autocommit :
Loại giao dòch autocommit được thiết lập quản lý giao dòch mặc đònh trong SQL Server .
Nếu một giao dòch thực hiện thành công thì nó được (commit : tất cả sự thay được tạo ra từ giao
dòch đó sẽ được cập nhật trong cơ sở dữ liệu) , nếu nó gặp bất kì lỗi nó sẽ roll back .
Trong mode autocommit , thỉnh thoảng xuất hiện lỗi nếu SQL Server roll back nguyên
cả batch (một tập các lệnh SQL cùng được xem xét và được thực thi , nó được biên dòch một lần
và kết thúc bởi lệnh go) thay vì một lệnh SQL . Điều này chỉ xảy ra nếu lỗi đụng độ là lỗi biên
dòch không phải là lỗi run-time . Lỗi biên dòch ngăn cản SQL Server xây dựng kế hoạch thực
thi , vì thế không có lệnh nào trong batch được thực thi .
• Ví dụ : Không có tác vụ INSERT trong batch thứ ba được thực thi vì quá trình biên dòch gặp
lỗi :
USE pubs
GO
CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3))
GO
INSERT INTO TestBatch VALUES (1, 'aaa')
INSERT INTO TestBatch VALUES (2, 'bbb')
INSERT INTO TestBatch VALUSE (3, 'ccc') /* Syntax error */
GO
SELECT * FROM TestBatch /* Returns no rows */
GO
Trong ví dụ sau , tác vụ INSERT thứ ba gặp lỗi thực thi do Cola là khóa chính nhưng hai
tác vụ đầu đều được thực thi :

USE pubs
GO
CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3))
GO
INSERT INTO TestBatch VALUES (1, 'aaa')
INSERT INTO TestBatch VALUES (2, 'bbb')
INSERT INTO TestBatch VALUES (1, 'ccc') /* Duplicate key
error */
GO
SELECT * FROM TestBatch /* Returns rows 1 and 2 */
GO
SQL Server 7.0 giới thiệu giải pháp delayed name không được resolve cho tới khi thời
gian thực thi . Các version trước của SQL Server resolve name trong thời gian dòch . Các lỗi này
là lỗi biên dòch và ngăn cản việc thực thi một batch trong các version trước , giờ đây là lỗi run-
time trong SQL Server 7.0 . Trong ví dụ hai tác vụ đầu được thực thi và commit, tác vụ thứ ba
trở thành lỗi thực thi do tham khảo vào một bảng chưa hình thành :
USE pubs
GO
CREATE TABLE TestBatch (Cola INT PRIMARY KEY, Colb CHAR(3))
GO
INSERT INTO TestBatch VALUES (1, 'aaa')
INSERT INTO TestBatch VALUES (2, 'bbb')
INSERT INTO TestBch VALUES (3, 'ccc') /* Table name error */
GO
SELECT * FROM TestBatch /* Returns rows 1 and 2 */
GO
II.4. Loại giao dòch Implicit:
Khi kết nối được tạo ra theo mode implicit transaction . SQL Server tự động khởi động
một giao dòch mới sau khi giao dòch hiện thời được commit hay roll back . User không làm bất
cứ điều gì để phác họa khởi tạo giao dòch ,user chỉ commit hay roll back mỗi giao dòch . Implicit

Transaction mode đưa ra các mắt xích nối kết liên tục các giao dòch.
Ví dụ :
SET QUOTED_IDENTIFIER OFF
GO
SET NOCOUNT OFF
GO
USE pubs
GO
CREATE TABLE ImplicitTran (Cola int PRIMARY KEY,
Colb char(3) NOT NULL)
GO
SET IMPLICIT_TRANSACTIONS ON
GO
/* First implicit transaction started by an INSERT statement
*/
INSERT INTO ImplicitTran VALUES (1, 'aaa')
GO
INSERT INTO ImplicitTran VALUES (2, 'bbb')
GO
/* Commit first transaction */
COMMIT TRANSACTION
GO
/* Second implicit transaction started by a SELECT statement
*/
SELECT COUNT(*) FROM ImplicitTran
GO
INSERT INTO ImplicitTran VALUES (3, 'ccc')
GO
SELECT * FROM ImplicitTran
GO

/* Commit second transaction */
COMMIT TRANSACTION
GO
SET IMPLICIT_TRANSACTIONS OFF
GO
III. GIAO DỊCH PHÂN BỐ (DISTRIBUTED TRANSACTION) :
III.1. Đặc điểm của giao dòch phân bố :
Giao dòch phân bố kết nối hai hay nhiều server đã được nhận biết nhờ resource
manager . Sự quản lý các giao dòch phải được ngang hàng giữa các quản lý tài nguyên bởi một
phần tử server gọi là transaction manager .
Một giao dòch trong SQL Server đơn kết nối hai hoặc nhiều database là một giao dòch
phân bố . Tuy nhiên ,SQL Server quản lý giao dòch bên trong , user thực thi nó như là thực thi
một giao dòch cục bộ .
Trong ứng dụng , một giao dòch phân bố được quản lý như là một giao dòch cục bộ . Khi
kết thúc giao dòch , ứng dụng yêu cầu commit hay rollback . Sự commit phân bố phải được quản
lý khác biệt với sự quản lý giao dòch để tối thiểu sự may rủi như network bò fail có thể gây ra
cho một số quản lý tài nguyên commit thành công trong khi những quản lý tài nguyên khác
rollback giao dòch .điều này được quản lý bằng giao thức 2PC ( two phase commit) :
• Prepare phase : khi quản lý giao dòch (Coordinator) nhận yêu cầu commit , nó gởi
một lệnh prepare tới tất cả quản lý tài nguyên khác (Participant) có liên quan trong
giao dòch . Mỗi participant thực hiện mọi yêu cầu để giao dòch đảm bảo tính bền
(durable) và tất cả buffer giữ các thao tác yêu cầu của giao dòch (log image) được
đẩy vào dóa .Khi mà pha prepare hoàn thành , nó sẽ trả về thành công hay thất bại
của pha prepare tới coordinator .
• Commit phase : Nếu coordinator nhận tín hiệu prepare từ các participant thì nó sẽ
gởi thông điệp commit đến các participant. Nếu bất kì participant nào gởi thông
điệp báo bò fail trong pha prepare , coordinator sẽ gởi thông điệp thông báo roll back
cho tất cả participant và tạo ra sự cố fail tới ứng dụng .
III.2. Tác vụ của giao dòch phân bố :
Giao dòch phân bố được khởi động trong trong Transact-SQL có cấu trúc tương đối đơn

giản :
1. Transac-SQL script hay sự kết nối ứng thực thi một câu lệnh SQL mà nó khởi động
giao dòch phân bố .
2. Việc SQL Server thực thi các câu lệnh SQL gọi là server điều khiển giao dòch .
3. Script hay ứng dụng thực thi cả truy vấn phân bố dựa vào các server đã được liên
kết lẫn việc gọi các store procedure từ xa dựa vào các server đãõ được gọi từ xa .
4. Khi truy vấn phân bố và việc gọi thủ tục từ xa được tạo ra , server điều khiển tự
động gọi MS DTC để lựa chọn các servser nối kết từ xa trong giao dòch phân bố .
5. Khi script hay ứng dụng đưa ra COMMIT hay ROLLBACK thì server điều khiển gọi
MS DTC quản lý quá trình hai pha commit hay khai báo việc kết nối các server để
roll back giao dòch của nó.
III.3. Khởi động giao dòch phân bố :
• Để khởi động một giao phân bố explicit dùng lệnh BEGIN DISTRIBUTED
TRANSACTION .User cũng có thể thực thi một truy vấn phân bố dựa vào server đã
được nối kết . Gọi MS DTC để quản lý giao dòch phân bố với các server đã được kết
nối . User cũng có thể gọi store procedure từ xa tới các SQL Server từ xa như là một
phần của giao dòch phân bố .
• Nếu OLE DA data source hỗ trợ giao tiếp ItransactionJoin thì giao dòch được thăng
cấp lên giao dòch phân bố , thậm chí truy vấn là truy vấn chỉ đọc . Nếu data source
không hỗ trợ ItransactionJoin ,thì chỉ có tác vụ chỉ đọc được cho phép .
• Nếu SET REMOTE_PROC_TRANSACTION ON được xử lý và giao dòch cục bộ gọi
store procedure từ xa trên một SQL Server khác thì giao dòch cục bộ được thăng cấp
thành giao dòch phân bố. SQL Server dùng MS DTC làm ngang bằng các giao dòch
phục vụ từ xa .
• Việc gọi store procedure từ xa thực thi bên ngoài phạm vi giao dòch cục bộ nếu
REMOTE_PROC_TRANSACTION được set thành OFF . Tác vụ được thực hiện bở
thủ tục từ xa thì không bò roll back nếu giao dòch cục bộ rool back . Tác vụ được làm
bởi store procedure từ xa được commit vào thời điểm thủ tục hoàn thành , không
phải khi giao dòch cục bộ được commit .
III.4. Truy vấn và giao dòch phân bố :

SQL Server cho phép user tạo ra kết nối với OLE DB bằng cách gọi server kết nối. Sau
khi link với data source user có thể :
• Tham khảo rowset từ data source của OLE DB như table trong Transact-SQL .
• Mỗi một lệnh truy vấn phấn bố có thể tham khảo đến nhiều server đã được kết nối
và có thẻ thực hiện các tác vụ update lẫn tác vụ đọc dựa trên mỗi server riêng rẽ .
Một truy vấn phân bố có thể thực hiện tác vụ đọc dựa vào vài server này và tác vụ
update dựa vào vài server khác . Các kiểu truy vấn được thực thi dựa trên các
server đã được nối kết phụ thuộc vào mức độ hỗ trợ cho giao dòch do OLE DB cung
cấp . OLE DB đònh nghóa hai giao tiếp chọn lựa cho việc quản lý giao dòch :
• ItransactionLocal : hỗ trợ giao dòch cục bộ trong data source của OLE DB
• ItransactionJoin : cho phép công cụ Join trong giao dòch phân bố với các quản lý
tài nguyên khác .
Bất kì provider nào hỗ trợ ItransactionJoin cũng hỗ trợ ItransactionLocal
Nếu một truy vấn phân bố được thi hành ở dạng mode autocommit , áp dụng những luật
sau :
• Chỉ toán tử đọc được cho phép dựa vào provider không hỗ trộ ItransactionLocal
• Tất cả những toán tử update được cho phép dựa vào provider hỗ trợ
ItransactionLocal
SQL Server tự động gọi ItransactionLocal cho mỗi server đã kết nối tham gia vào
toán tử update để khởi dộng giao dòch cục bộ và commit chúng khi trạng thái thành công hay
rool back nếu trạng thái fail .
Nếu một truy vấn phân bố được thực thi khi sự kết nối là explicit hay implicit thì áp
dụng các luật sau :
• Chỉ toán tử đọc cho phép dựa vào provider không hỗ trợ ItransactionJoin .Provider
không hỗ trợ bất kì giao dòch nào hay chỉ hỗ trợ ItransactionLocal nhưng không thể
tham gia vào toán tử update .
• Nếu SET XACT_ABORT ON ,tất cả toán tử update được cho phép dựa vào provider
hỗ trợ ItransactionJoin . SQL Server tự động gọi ItransactionJoin trong mỗi
server đã liên kết tham gia vào toán tử update để tuyển nó vào giao dòch phân bố.
MS DTC commit hay roll back khi server điều khiển tạo ra giao dòch được commit

hay roll back .
• Nếu SET XACT_ABORT OFF ,server đã được nối kếtphái hỗ trợ giao dòch lồng
nhau (nested) trước khi toán tử update được cho phép .Giao dòch lồng nhau được hỗ
trợ nếu provider hỗ trợ Itransaction::StartTransaction . Điều này cho phép SQL
server roll back những lệnh riêng rẽ trong truy vấn phân bố mà không roll back
nguyên giao dòch .
IV. NHỮNG TÍNH CHẤT KHÁC CỦA GIAO DỊCH :
IV.1. Giao dòch lồng nhau (Nesting Transaction) :
Giao dòch rõ ràng (Explicit) có thể được lồng vào nhau . Điều này có khuynh hướng
chính là hỗ trợ giao dòch trong store procedure mà nó có thể được gọi từ một quá trình trong
một giao dòch lẫn từ nhiều quá trình .
Ví dụ sau trình bày giao dòch lồng nhau : Nếu thủ tục TranProc được gọi khi một giao
dòch được hoạt động thì những giao dòch bên trong thủ tục TranProc bò lờ đi và những tác vụ
INSERT sẽ được commit hay roll back hụ thuộc vào những giao dòch bên ngoài :
Việc commit bên trong giao dòch bò lờ đi . Giao dòch được commit hay roll back dựa vào
tác vụ được tạo ra khi kết thúc giao dòch ngoài cùng . Nếu giao dòch nhoài được commit thì
giao dòch lồng bên trong cũng được commit . Nếu giao dòch ngoài roll back thì tất cả giao dòch
bên trong cũng roll back bất chấp các giao dòch bên trong có commit hay không .
IV.2. Transaction Savepoint :
Savepoint cung cấp kỹ thuật roll back từng phần của giao dòch . User tạo ra một
savepoint bằng cách đưa ra lệnh SAVE_TRANSACTION savepoint_name để roll back từng
phần thay vì roll back cả giao dòch .
Savepoint được dùng trong tình huống mà lỗi không chắc sẽ xảy ra . Việc sử dụng
savepoint để roll back một phần của giao dòch trong trường hợp lỗi hiếm khi xảy ra có thể
hiệu quả hơn là thử trên từng giao dòch xem toán tử update có hợp lệ hay không trước khi thực
hiện update. Toán tử update và rollback là những toán tử có chí phí cao, vì thế savepoint chỉ
hiệu quả nếu khả năng xuất hiện lỗi thấp và chí phí kiểm tra tính hợp lệ của update đã sẵn
sàng từ trước tương đối cao.
Ví dụ :
SET NOCOUNT OFF

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

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