如沒有指定,MySQL默認(rèn)采用的是REPEATABLE-READ
ORACLE默認(rèn)的是READ-COMMITTED
MySQL在REPEATABLE-READ和READ-COMMITTED在某些情況下會表現(xiàn)出不同的鎖級別,下面舉例說明。
首先創(chuàng)建測試表
CREATE TABLE ivan(
f_id int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
f_content varchar(32) NOT NULL DEFAULT ”
) engine=innodb DEFAULT charset=latin1;
INSERT INTO ivan(f_id, f_content) VALUES(1, ‘http://www.mysqlab.net’);
INSERT INTO ivan(f_id, f_content) VALUES(1, ‘http://www.mysqlab.net/blog/’);
INSERT INTO ivan(f_id, f_content) VALUES(1, ‘http://www.mysqlab.net/bbs/’);
#session 1
SET tx_isolation=‘REPEATABLE-READ’;
SET auto_commit=0;
UPDATE ivan SET f_content=” WHERE f_content=‘http://www.mysqlab.net’;
#session 2
SET tx_isolation=‘REPEATABLE-READ’;
UPDATE ivan SET f_content=” WHERE f_content=‘http://www.mysqlab.net/blog/’;
這時候你會發(fā)現(xiàn),#session2 一直等待,直到#session1 commit之后,#session2才會返回,但是如果f_content存在索引,則會立即返回結(jié)果。這些是基于REPEATABLE-READ的測試,在READ-COMMITTED的情況下則表現(xiàn)和oracle一樣,update會立即完成并返回結(jié)果。
#session 1
SET tx_isolation=‘READ-COMMITTED’;
SET auto_commit=0;
UPDATE ivan SET f_content=” WHERE f_content=‘http://www.mysqlab.net’;
#session 2
SET tx_isolation=‘READ-COMMITTED’;
UPDATE ivan SET f_content=” WHERE f_content=‘http://www.mysqlab.net/bbs/’;