jackshan 发表于 2010-01-19 17:05

事务隔离级别导致锁级别的不


MySQL支持4种事务隔离级别,他们分别是:
READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.

如没有指定,MySQL默认采用的是REPEATABLE-READ
ORACLE默认的是READ-COMMITTED
MySQL在REPEATABLE-READ和READ-COMMITTED在某些情况下会表现出不同的锁级别,下面举例说明。
首先创建测试表
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/’;

这时候你会发现,#session2 一直等待,直到#session1 commit之后,#session2才会返回,但是如果f_content存在索引,则会立即返回结果。这些是基于REPEATABLE-READ的测试,在READ-COMMITTED的情况下则表现和oracle一样,update会立即完成并返回结果。
#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/’;

总结:MySQL 在innodb等事务引擎的情况下,如果没有特殊要求,可以将默认的事务隔离级别设置为 READ-COMMITTED
或者开启 innodb_locks_unsafe_for_binlog
transaction_isolation = READ-COMMITTED
innodb_locks_unsafe_for_binlog=On

另外,涉及到的条件更新尽量建索引,这样一来对主键的选择就要严格控制,以便充分利用好宝贵的内存资源,因为innodb采用的是cluster index,其他索引都会带上它。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/51714/showart_2153381.html
页: [1]
查看完整版本: 事务隔离级别导致锁级别的不