我有一个包含电子邮件列表和自动递增ID的表,在该表上完成索引。
CREATE TABLE EMAIL_LIST
(
ID int NOT NULL AUTO_INCREMENT,
email_ID varchar(255),
lastFetchedID int,
PRIMARY KEY (ID)
);
CREATE INDEX PIndex ON EMAIL_LIST (ID);
然后我有多台计算机唯一地获取email_ID,这是为了扩展获取过程。 但是要获取的email_ID是在条件下描述的。
SELECT lastFetchedID FROM EMAIL_LIST WHERE ID=1 FOR UPDATE; // say this is x;
UPDATE EMAIL_LIST SET lastFetchedID=lastFetchedID+100 WHERE ID=1;
SELECT email_ID FROM EMAIL_LIST WHERE ID>=x AND ID< x+100;
这样每台计算机都有一组不同的email_ID
我只是想知道我是否使用select for update,并且在同一连接中,如果我获取100 email_ID,那么整个交易中ID = 1的行会有独占锁吗?
并且实现这一目标的最佳方式是什么,计算机的数量可能会有所不同,所以我这样做。
答案 0 :(得分:0)
来自http://dev.mysql.com/doc/refman/5.5/en/innodb-locks-set.html:
锁定读取,UPDATE或DELETE通常会在处理SQL语句时扫描的每个索引记录上设置记录锁定。
这意味着将在id = 1
的行上设置锁定。