mysql 四个隔离级别的介绍

来源:互联网 发布:手机算命软件下载 编辑:程序博客网 时间:2024/06/04 18:47

myisam 不支持事务 ,innodb支持事务。我这次是用innodb做的测试。

1.查看及设置隔离级别

查看当前会话隔离级别select @@tx_isolation;查看系统当前隔离级别select @@global.tx_isolation;设置当前会话隔离级别set session transaction isolatin level repeatable read;(level后面是级别,设置成你想设置的就好了)设置系统当前隔离级别 set global transaction isolation level repeatable read;一般情况下设置当前就ok了

2.隔离级别的介绍

关于隔离级别的理解    1.read uncommitted    可以看到未提交的数据(脏读),举个例子    事务A开始进行操作user表,如果此时事务B往user表中更新了一条数据,就算它没有commit提交,这个时候事务A处查询,此时也查询出了事务B新增的未提交的数据。这种情况称为脏读。    2.read committed    读取提交的数据。但是,可能多次读取的数据结果不一致(不可重复读,幻读)。已提交读隔离级别解决了脏读的问题,但是出现了不可重复读的问题,即事务A在两次查询的数据不一致,因为在两次查询之间事务B更新了一条数据。已提交读只允许读取已提交的记录,但不要求可重复读。    3.repeatable read(MySQL默认隔离级别)    这个隔离级别的事务已经很可靠了。可以重复读取,但有幻读。读写观点:读取的数据行不可写,但是可以往表中新增数据。在MySQL中,其他事务新增的数据,看不到,不会产生幻读。采用多版本并发控制(MVCC)机制解决幻读问题。    4.serializable    这个级别慎用。。。    可读,不可写。像java中的锁,写数据必须等待另一个事务结束。    如果一个事务拿到了写锁。会阻塞所有其他的事务的写操作。。或造成大量的锁竞争和超时现象。。但是这个最安全。不会出现像前面说的那几种情况了,这完全就是串行了。

3.关于测试。

  创建一个innodb的表,开两个命令行,在a窗口不断改变隔离级别。b窗口做辅助操作。  举例,验证read uncommitted  1.在A窗口设置隔离级别为read uncommitted。  2.在A窗口开启事务  start transaction  3.在A窗口查询你的innodb表。select * from table_name;  4.在b窗口开启事务  start transaction  5.在b窗口修改innodb表中的一条数据。  6.在a窗口查询你的innodb表。select * from table_name;    发现修改过的内容已经查询出来,和前面的查询结果不一致。这时候就出现了脏读现象。  验证  read committed      1.在A窗口设置隔离级别为read uncommitted。  2.在A窗口开启事务  start transaction  3.在A窗口查询你的innodb表。select * from table_name;  4.在B窗口开启事务  start transaction  5.在B窗口修改innodb表中的一条数据。  6.在A窗口查询你的innodb表。发现没有问题。  7.在B窗口commit,然后再去A窗口查询你的innodb表。select * from table_name;发现查询结果中已经有修改后的内容。这是出现了不可重复读现象。因为在事务A进行中,另一个事务可能操作过这条数据。造成这条数据不一致。   验证  repeatable read   和上面的类似,但是结果是不一致的,因为这个级别默认是可以隔离别的事务的,各个事务之间的修改不影响。包括insert数据。innnodb实现了mvcc来进行多版本并发控制(我还没有看呢。等我看了在写)   至于最稳定的serializable级别   某个事务开启,则它就拿到了写锁,其他事物,读取数据ok。写操作,则进入等待,直到这个事务提交,下个事务拿到锁。这个级别的慎用。

4.了解这些级别和他们会带来的问题后,看别的东西至少不会在疑惑了,这个真是。。加油吧。

参考文章
http://blog.csdn.net/jiangwei0910410003/article/details/24960785
http://xm-king.iteye.com/blog/770721