PDA

View Full Version : Select >> Lock Table



SkidRow
08-11-2007, 11:33
cho mình hỏi
có 2 connection cùng 1 lúc select data from table >> có khả năng 2 connection cùng select 1 record >> :no:
mình muốn bắt 1 connection select xong trước >> ví dụ select 10 rec để insert vào 1 bảng khác >> xong rồi >> thì connection còn lại mới được vào select tiếp 20 rec
thanks nhiều nhé (mong có code minh họa) :helpsmili:yes:

Truongtn
08-11-2007, 14:27
Bạn nên tìm hiểu về transaction và Database Engine Isolation Levels.

Link tham khảo:
http://msdn2.microsoft.com/en-us/library/ms189122.aspx
http://msdn2.microsoft.com/en-us/library/ms173763.aspx

Bạn cần tránh hiệu ứng cạnh tranh (http://msdn2.microsoft.com/en-us/library/ms190805.aspx) nào thì bạn phải dùng chế độ khóa tương ứng.

Ví dụ cần khóa không cho transaction khác update bản ghi (Nonrepeatable Read) thì set chế độ REPEATABLEREAD. Nếu cần khóa để cho câu select trong transaction luôn trả về số bản ghi là hằng số (Phantom Reads) thì set chế độ SERIALIZABLE.

Trường hợp bạn nêu hơi khó hiểu là 10 bản ghi đầu có nằm trong 20 bản ghi sau không. Cạnh tranh chỉ xảy ra khi ta cùng update các row, page của table. Một câu lệnh select không bao giờ khóa câu lệnh select khác, nó chỉ khóa không cho thay đổi data thôi.

Theo tôi nghĩ bạn nên tạo môt table có trường Locked làm khóa. Bắt đầu Transaction thì check update Locked = 0, nếu không raise error.
Sau đó Update Locked = 1, thực hiện công việc xong thì Update Locked = 0, commit transaction:

BEGIN TRANSACTION

Select @Locked = Locked
From TransactionLock With (ROWLOCK, REPEATABLEREAD) -- Khoa khong cho transaction update;

IF @Locked = 0
RAISERROR ();

Update TransactionLock SET Locked = 1;

-- Thuc hien cong viec o day

Update TransactionLock SET Locked = 0;

COMMIT TRANSACTION;

Chúc thành công

SkidRow
08-11-2007, 19:03
cám ơn bạn nhiều lắm !!!!!