PDA

View Full Version : Tạo lock table như thế nào?



donghoqualac
28-09-2007, 09:18
Mình có một table, có một trường làm ID (num_id)

Mỗi lần Insert một record mới mình phải lấy số lớn nhất trong cột num_id rồi cộng thêm 1 để có được num_id tiếp theo.

Nhưng khi hai connection cùng lấy ra một max ID, và lúc đó sẽ xảy ra trường hợp là trùng num_id khi cả hai connection này cùng Insert.

Vậy mình phải làm cách nào (đơn giản càng tốt) để khi connection A select max ID thì nó lock luôn bảng đó lại và sau khi insert xong mới unlock để cho connection khác làm việc.

Xin mọi người chỉ giáo

hoangnam_bv
28-09-2007, 11:28
Mình sư dung như sau: solution for SQL2000, nếu bạn sử dụng SQL2005 se có cách hay hơn
1. USER A
Begin transaction

Select * from <TABLE> WITH(ROWLOCK, UPDLOCK) WHERE ...

2. USER B

SET LOCK_TIMEOUT 0
UPDATE <TABLE> SET COLUMN = '...' WHERE ....

se ouput error neu userA is locking

donghoqualac
28-09-2007, 15:17
Cám ơn bạn nhé! Mình dùng SQL 2000

Select * from <TABLE> (TABLOCKX)

Mình có đọc tài liệu thì nó chỉ ra cái loại này mới là Exclusive Lock, tức là khi connect A đã lock <TABLE>, thì các connection khác không thể view được, cho đến khi nào connection A giải phóng tài nguyên đã bị lock.
Mình không rõ là mặc định các connect khác chờ đợi trong bao lâu khi <TABLE> đang bị lock.

Bạn cho mình hỏi thêm là đoạn "SET LOCK_TIMEOUT 0" có mặc định như thế không nhỉ (tức là mình không cần thực hiện dòng lệnh đó)?

malefly
28-09-2007, 16:02
cai nay dau can gi ma Log voi ko lock chu.

ban tao 1 store procedure OUT PUT tra ve cai cot ID cua ban la ko bao gio trung lap dau

xbacala
28-09-2007, 23:13
Mình có một table, có một trường làm ID (num_id)

Mỗi lần Insert một record mới mình phải lấy số lớn nhất trong cột num_id rồi cộng thêm 1 để có được num_id tiếp theo.

Nhưng khi hai connection cùng lấy ra một max ID, và lúc đó sẽ xảy ra trường hợp là trùng num_id khi cả hai connection này cùng Insert.

Vậy mình phải làm cách nào (đơn giản càng tốt) để khi connection A select max ID thì nó lock luôn bảng đó lại và sau khi insert xong mới unlock để cho connection khác làm việc.

Xin mọi người chỉ giáo

Sao không dùng IDENTITY mà dùng cách này. Cách này vừa chậm vừa dễ sinh deadlock.

Dùng biến @@IDENTITY để lấy giá trị mới phát sinh tự động.

donghoqualac
28-09-2007, 23:51
Sao không dùng IDENTITY mà dùng cách này. Cách này vừa chậm vừa dễ sinh deadlock.

Dùng biến @@IDENTITY để lấy giá trị mới phát sinh tự động.

Cái ID của mình không đơn giản là chỉ cộng thêm một mà qua một số tính toán và xử lý khác nữa. Mình chỉ lấy ví dụ cho dễ hiểu thôi!

donghoqualac
28-09-2007, 23:59
cai nay dau can gi ma Log voi ko lock chu.

ban tao 1 store procedure OUT PUT tra ve cai cot ID cua ban la ko bao gio trung lap dau

Quá trình xử lý cái ID thì tớ không viết được store procedure vì nó khá phức tạp chứ không chỉ la` New ID = Max ID + 1.