首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > Mysql >

MySQL中的事宜隔离级别

2012-09-25 
MySQL中的事务隔离级别离级别?脏读(Dirty Read)?? ? ? ? 不可重复读(NonRepeatable Read)幻读(Phantom Rea

MySQL中的事务隔离级别

离级别?脏读(Dirty Read)?? ? ? ? 不可重复读(NonRepeatable Read)幻读(Phantom Read)读未提交(Read uncommitted)可能可能可能读已提交(Read committed)不可能可能可能可重复读(Repeatable read)不可能不可能可能可串行化(Serializable )不可能不可能不可能在MySQL中默认事务隔离级别是可重复读(Repeatable read).可通过SQL语句查询:查看InnoDB系统级别的事务隔离级别:
?? ?mysql> SELECT @@global.tx_isolation;
结果:+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ? ?? ? |
+-----------------------+
1 row in set (0.00 sec)
查看InnoDB会话级别的事务隔离级别:
??mysql> SELECT @@tx_isolation;
结果:
+-----------------+
| @@tx_isolation? |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)
修改事务隔离级别:
?? ?mysql> set global transaction isolation level read committed;
?? ?Query OK, 0 rows affected (0.00 sec)

?? ?mysql> set session transaction isolation level read committed;

?? ?Query OK, 0 rows affected (0.00 sec)
InnoDB的可重复读隔离级别和其他数据库的可重复读是有区别的,不会造成幻象读(phantomread),所谓幻象读,就是同一个事务内,多次select,可以读取到其他sessioninsert并已经commit的数据。下面是一个小的测试,证明InnoDB的可重复读隔离级别不会造成幻象读。测试涉及两个session,分别为session 1和session 2,隔离级别都是repeateable read,关闭autocommit
?? ?mysql> select @@tx_isolation;
???? ?+-----------------+
?? ?| @@tx_isolation? |
?? ?+-----------------+
?? ?| REPEATABLE-READ |
?? ?+-----------------+
?? ?1 row in set (0.00 sec)
????? ?mysql> set autocommit=off;
?? ?Query OK, 0 rows affected (0.00 sec)
session 1 创建表并插入测试数据
? ?? mysql> create?table?test(i int) engine=innodb;?? ?Query OK, 0 rows affected (0.00 sec)
?? ?mysql> insert into test values(1);
?? ?Query OK, 1 row affected (0.00 sec)
session 2 查询,没有数据,正常,session1没有提交,不允许脏读
? ?? mysql> select * from test;
?? ??Empty set (0.00 sec)
session 1 提交事务
?? ?mysql> commit;
?? ?Query OK, 0 rows affected (0.00 sec)
session 2 查询,还是没有数据,没有产生幻象读
? ?? ?? ?? ?? ?? ?? ?? ?
?? ?mysql> select * from test;
?? ?Empty set (0.00 sec)
? ?? ?? ?? ?? ?? ?? ?? ?
? ?? ?? ?? ?? ?? ?? ?? ?
以上试验版本:
? ?? ?? ?? ?? ?? ?? ?? ?
?? ?mysql> select version();
?? ?+-------------------------+
?? ?| version()? ?? ?? ?? ?? ?|
?? ?+-------------------------+
?? ?| 5.0.37-community-nt-log |
?? ?+-------------------------+
?? ?1 row in set (0.00 sec)

热点排行