- 論壇徽章:
- 0
|
MySQL支持4種事務(wù)隔離級(jí)別,他們分別是:
READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
如沒(méi)有指定,MySQL默認(rèn)采用的是REPEATABLE-READ
ORACLE默認(rèn)的是READ-COMMITTED
MySQL在REPEATABLE-READ和READ-COMMITTED在某些情況下會(huì)表現(xiàn)出不同的鎖級(jí)別,下面舉例說(shuō)明。
首先創(chuàng)建測(cè)試表
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/’;
這時(shí)候你會(huì)發(fā)現(xiàn),#session2 一直等待,直到#session1 commit之后,#session2才會(huì)返回,但是如果f_content存在索引,則會(huì)立即返回結(jié)果。這些是基于REPEATABLE-READ的測(cè)試,在READ-COMMITTED的情況下則表現(xiàn)和oracle一樣,update會(huì)立即完成并返回結(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/’;
總結(jié):MySQL 在innodb等事務(wù)引擎的情況下,如果沒(méi)有特殊要求,可以將默認(rèn)的事務(wù)隔離級(jí)別設(shè)置為 READ-COMMITTED
或者開(kāi)啟 innodb_locks_unsafe_for_binlog
transaction_isolation = READ-COMMITTED
innodb_locks_unsafe_for_binlog=On
另外,涉及到的條件更新盡量建索引,這樣一來(lái)對(duì)主鍵的選擇就要嚴(yán)格控制,以便充分利用好寶貴的內(nèi)存資源,因?yàn)閕nnodb采用的是cluster index,其他索引都會(huì)帶上它。
本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u1/51714/showart_2153381.html |
|