Chinaunix首页 | 论坛 | 博客
  • 博客访问: 304224
  • 博文数量: 26
  • 博客积分: 2052
  • 博客等级: 大尉
  • 技术积分: 686
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-23 22:02
文章分类

全部博文(26)

文章存档

2013年(1)

2011年(1)

2010年(12)

2009年(2)

2008年(10)

我的朋友

分类: Mysql/postgreSQL

2010-01-19 17:05:21

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, ‘’);
INSERT INTO ivan(f_id, f_content) VALUES(1, ‘/blog/’);
INSERT INTO ivan(f_id, f_content) VALUES(1, ‘/bbs/’);
 

#session 1

SET tx_isolation=‘REPEATABLE-READ’;
SET auto_commit=0;
UPDATE ivan SET f_content= WHERE f_content=‘’;
 

#session 2

SET tx_isolation=‘REPEATABLE-READ’;
UPDATE ivan SET f_content= WHERE f_content=‘/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=‘’;
 

#session 2

SET tx_isolation=‘READ-COMMITTED’;
UPDATE ivan SET f_content= WHERE f_content=‘/bbs/’;
 



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

transaction_isolation = READ-COMMITTED
innodb_locks_unsafe_for_binlog=On
 

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

阅读(1694) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~