以下是FOR UPDATE intention lock的簡單示例。 INNODB引擎的行級鎖定。該示例顯示了四行用於下一個可用序列,它們不會遇到衆所周知的INNODB間隙異常(在使用AUTO_INCREMENT失敗後出現間隙的情況)。
模式:
-- drop table if exists sequences;
create table sequences
( id int auto_increment primary key,
sectionType varchar(200) not null,
nextSequence int not null,
unique key(sectionType)
) ENGINE=InnoDB;
-- truncate table sequences;
insert sequences (sectionType,nextSequence) values
('Chassis',1),('Engine Block',1),('Brakes',1),('Carburetor',1);
示例代碼:
START TRANSACTION; -- Line1
SELECT nextSequence into @mine_to_use from sequences where sectionType='Carburetor' FOR UPDATE; -- Line2
select @mine_to_use; -- Line3
UPDATE sequences set nextSequence=nextSequence+1 where sectionType='Carburetor'; -- Line4
COMMIT; -- Line5
理想情況下,你不必在全部Line3
或bloaty代碼會耽誤其他客戶端上的鎖等待。意思是,讓你的下一個序列使用,執行更新(增量部分),並且儘快COMMIT
,儘快。
上面在存儲過程:
DROP PROCEDURE if exists getNextSequence;
DELIMITER $$
CREATE PROCEDURE getNextSequence(p_sectionType varchar(200),OUT p_YoursToUse int)
BEGIN
-- for flexibility, return the sequence number as both an OUT parameter and a single row resultset
START TRANSACTION;
SELECT nextSequence into @mine_to_use from sequences where sectionType=p_sectionType FOR UPDATE;
UPDATE sequences set nextSequence=nextSequence+1 where sectionType=p_sectionType;
COMMIT; -- get it and release INTENTION LOCK ASAP
set [email protected]_to_use; -- set the OUT parameter
select @mine_to_use as yourSeqNum; -- also return as a 1 column, 1 row resultset
END$$
DELIMITER ;
測試:
set @myNum:= -1;
call getNextSequence('Carburetor',@myNum);
+------------+
| yourSeqNum |
+------------+
| 4 |
+------------+
select @myNum; -- 4
相應地修改所存儲的程序爲你需要,例如僅具有2個機制的1對檢索序列號(OUT參數或結果集)。換句話說,很容易拋棄OUT
參數的概念。
如果您不遵守LOCK的ASAP版本(在更新後顯然不需要),並且在發佈之前繼續執行耗時的代碼,那麼可能會在其他客戶端正在等待序列號:
錯誤1205(HY000):鎖定超時超時;嘗試重新啓動 交易
希望這不是問題。
show variables where variable_name='innodb_lock_wait_timeout';
MySQL手冊頁爲innodb_lock_wait_timeout。
在我的系統上此刻它的值爲50(秒)。在大多數情況下,等待超過一秒鐘或兩秒鐘可能是無法忍受的。
另外的交易期間的利息是從以下命令輸出的那一段:
SHOW ENGINE INNODB STATUS;
給的是什麼在你的心中是一個序列,以表明這一點的例子。並解釋你爲什麼不能用存儲過程自己做這件事。 – Drew