首页 > MySQL > 事务隔离级别导致锁级别的不同

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



Author: ivan@mysqlab.net
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,其他索引都会带上它。

Related posts:

  1. update更新数字主键的时候可能导致主从(master/slave)复制中断
  2. 发布自己的DbSession类(for php)
分类: MySQL 标签:
  1. digital猪头
    2009年7月28日15:43 | #1

    受教了,好文章!谭老大,有点小小的笔误:
    1.那三条insert 语句的f_id值都是1
    2.”set auto_commit=0;”中间没有下划线吧

  1. 2009年4月28日10:20 | #1