这是我上一个问题的后续问题(您可以跳过它,因为我在这篇文章中解释了该问题):
MySQL InnoDB SELECT...LIMIT 1 FOR UPDATE 与 UPDATE ...LIMIT 1 https://stackoverflow.com/questions/14039853/mysql-innodb-select-limit-1-for-update-vs-update-limit-1
环境:
- Glassfish 上的 JSF 2.1
- JPA 2.0 EclipseLink 和 JTA
- MySQL 5.5 InnoDB 引擎
我有一张桌子:
CREATE TABLE v_ext (
v_id INT NOT NULL AUTO_INCREMENT,
product_id INT NOT NULL,
code VARCHAR(20),
username VARCHAR(30),
PRIMARY KEY (v_id)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;
它填充了 20,000 条记录,如下所示 (product_id
所有记录均为 54,code
是随机生成的且唯一的,用户名设置为 NULL):
v_id product_id code username
-----------------------------------------------------
1 54 '20 alphanumerical' NULL
...
20,000 54 '20 alphanumerical' NULL
当用户购买产品54时,他从该表中获得一个代码。如果用户多次购买,则每次都会获得一个代码(对用户名没有唯一限制)。因为我正在准备一项高强度的活动,所以我想确保:
从SO问题(参见上面的链接)我发现做这样的查询更快:
START TRANSACTION;
SELECT v_id FROM v_ext WHERE username IS NULL LIMIT 1 FOR UPDATE;
// Use result for next query
UPDATE v_ext SET username=xxx WHERE v_id=...;
COMMIT;
但是,我仅在使用索引时才发现死锁问题username
柱子。我认为添加索引会有助于加快一点速度,但它会在大约 19,970 条记录后产生死锁(实际上在这个行数上非常一致)。是否有一个原因?我不明白。谢谢。