chia sẻ

Sử dụng giao tác và khoá.

-Giao tác (transaction): Tập hợp các câu lệnh thi hành công việc gì đó, nếu trong các câu lệnh đó có một câu thất bại thì các câu lệnh khác sẽ bị huỷ.

-Khoá (Lock): Nếu các dòng của bảng đang xử lý, người ta có thể cấm không cho người khác xem hoặc sửa đổi
-Mở khoá (Unlock): Giải phóng các bản ghi đó để cho người khác cùng xem hoặc sửa.

1. Khái niệm giao tác.

Ví dụ 1: Mượn sách gồm 2 công đoạn
            +Bước 1: Viết phiếu yêu cầu mượn: Tên, số thẻ...
            +Bước 2: Chỉ ra các sách cần mượn: Tìm sáchàMượn
            Nếu Số thẻ không đúng hoặc quá hạn thì huỷ bước 2
Nếu thẻ đúng: Nếu sách cần mượn không có, mượn quá số
lượng thì huỷ cả bước 1, 2.
Tức: Công việc mượn sách sẽ thành công khi cả bước 1 và bước thành công
Bị thật bại khi bước 1 hoặc bước 2 bị sai
Cả 2 bước trên gọi là một giao tác.
Đối với CSDL:
Bước 1: Insert into Borrows Values(‘MaPhieu’,’SoThe’,’NgayMuon’)àRàng buộc, trigger sẽ kiểm tra           
Bước 2: Insert into BorrowDetail Values(MaPhieu,‘MaSach’,NgayTra,SoLuong)àKiểm tra ràng buộc NgayTra>=NgayMuon, TongSL<=5
Nếu một trong 2 câu lệnh trên bị sai sẽ huỷ cả 2
-Nếu có giao tác máy sẽ không ghi dữ liệu vào bảng ngay lúc đó, mà nó sẽ lưu dữ liệu vào buffer (vùng nhớ đệm)àTức là lưu vào Log Files.
Khi kết thúc giao tác: Máy sẽ kiểm tra toàn bộ các câu lệnh của giao tác, nếu tất cả đều thành công thì máy sẽ chuyển dữ liệu từ Log FilesàData Files, hoặc từ bufferàBảng thật.
-Quá trình lưu dữ liệu vào Log Files xảy ra khi có các câu lệnh Alter, Update, Insert, Delete, create...
-Quá trình chuyển dữ liệu từ Log FilesàData Files xảy ra theo một chu kỳ nào đó (ví dụ khoảng 1 phút, 2 phút...)
Máy sẽ kiểm tra: Log Files có dữ liệu hay không, giao tác kết thúc hay chưa thì máy sẽ chuyển dữ liệu vào Data Filesàquá trình kiểm tra này gọi là CheckPoint.
Quá trình CheckPoint còn xảy ra khi:
            +Khi SQL server được khởi động (khi start)
            +Khi SQL Server shutdown
            +Khi kết thúc một giao tác
            +Hoặc khi xoá bảng hoặc xoá chỉ mục (Drop table, drop index)
Hoặc sử dụng câu lệnh DBCC SHRINKFILE.

2. Tạo và sử dụng giao tác.

a. Các loại giao tác.

-Có 3 loại giao tác:
+Autocommit Transaction (giao tác tự động): Tự động tạo giao tác khi có các câu lệnh insert, update, delete, create, grant,...tự động kết thúc giao tác khi câu lệnh đó thực hiện xong.   
+Implicit Transaction (Giao tác ngầm định, giao tác không tường minh): Giao tác tự động khi câu lệnh đầu tiên xảy ra, sẽ tồn tại đối với các câu lệnh sau, không tự động kết thúc
Giao tác sẽ kết thúc khi ta gặp câu lệnh COMMIT TRAN hoặc COMMIT WORK (thành công), hoặc gặp câu lệnh ROLLBACK TRAN hoặc ROLLBACK WORK (giao tác bị huỷ).
+Explicit Transaction (Giao tác tường minh):
Giao tác sẽ được tạo bởi câu lệnh BEGIN TRAN (BEGIN TRANSACTION)
Sẽ kết thúc khi có câu lệnh COMMIT hoặc ROLLBACK

b. Sử dụng các giao tác.

-Mặc định là autocommit transaction.
-Tạo giao tác không tường minh: Có 2 cách.
        +Cách 1: Dùng khai báo SET IMPLICIT_TRANSACTIONS ON
               Ví dụ:
SET IMPLICIT_TRANSACTIONS ON
insert into categories values('VLD',N'Vật lý điện')
insert into categories values('VLN',N'Vật lý nhiệt')
SET IMPLICIT_TRANSACTIONS OFF
+Dùng Query Analyzer chạy 4 câu lệnh trên, sau đó thoát khỏi Query Analyzer và kiểm tra lại bảng Categories, sẽ thấy không có 2 dòng vừa thêm
Lý do: Máy chỉ ghi dữ liệu vào bộ nhớ đệm mà chưa ghi vào bảng thật do ta chưa kết thúc giao tác.
+Cách 2: Vào chức năng ToolsàOptionsàConnection PropertiesàĐánh dấu vào mục Set implicit_transaction, thì tất cả các cửa sổ lệnh đều chuyển sang giao tác không tường minh
Chu ý: Khi giao tác chưa kết thúc thì ở cửa sổ khác (kết nối khác) không thể xem, sửa, xoá dữ liệu các bảng trong giao tácàtức các bảng đó đã bị khoá.
-Tạo giao tác tường minh (Explicit Transaction):
+Để tạo giao tác tường minh ta sử dụng câu lệnh BEGIN TRAN
Ví dụ:
BEGIN TRAN
            insert into categories values('VLD',N'Vật lý điện')
            insert into categories values('VLN',N'Vật lý nhiệt')

IF @@error=0 COMMIT TRAN else ROLLBACK TRAN

3. Khoá (Lock)

-Khi giao tác đang xảy ra thì các bảng ta đang xử lý sẽ bị khoá
Các bảng đó sẽ được mở khoá khi giao tác kết thúc.
-Các kiểu khoá:        
+Sửa đối, xoá dữ liệu nhưng không khoá(Optimistic): Cho phép nhiều người cùng sửaàGọi là kết nối kiểu lạc quan.
+Sửa đổi, xoá dữ liệu sẽ khoá toàn bộ bảng hoặc các bản ghi đang xử lý (Pessimistic)àGọi là kiểu kết nối bi quan.
Một số kiểu khoá:
HOLDLOCK: Khoá chia sẽ trong cùng kết nối, chỉ khoá ở cửa số khác, kết nối khác.
NOLOCK: Không khoá
PAGLOCK: Khoá phần dữ liệu (trang) đang truy cập
UPDLOCK: Chỉ khoá các trang đang sửa đổi
XLOCK: Khoá toàn bộ bảng cho đến khi kết thúc giao tác.
Ví dụ:
select * from categories(HOLDLOCK)
where categoryid in ('TT','TN')    
Nguồn:  clovea.multiply

Không có nhận xét nào:

Đăng nhận xét

 
Ky nang ban hang ky-nang-ban-hang
10 10 1125 (c) by
Google Thủ thuật, hacking, tool, code, công cụ