這是我剛纔的問題的後續行動(你可以跳過它,因爲我在這個職位的問題解釋):
MySQL InnoDB SELECT...LIMIT 1 FOR UPDATE Vs UPDATE ... LIMIT 1MySQL的選擇...用於索引更新有併發問題
環境:
- JSF 2.1在Glassfish
- 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;
它被填充有20000個記錄像這樣的(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;
但是我發現使用索引只有當一個死鎖問題欄。我想添加一個索引有助於加速一點點,但是在大約19,970條記錄之後(實際上在這個行數相當一致)會造成一個死鎖。是否有一個原因?我不明白。謝謝。
什麼是您的事務隔離級別?你有沒有嘗試減少它到'讀提交'? –
如何獲得TX隔離級別。我正在使用JTA,我不能'em.getTransaction()' – JScoobyCed