首页 / 正文

Mysql 事务级别说明

未分类 2009年05月5日 吴 炳锡 163

      mysql 事务级别说明作/译者:吴炳锡 wubingxi#gmail.com 来源:http://www.mysqlsupport.cn/ 转载请注明作/译者和出处,并且不能用于商业用途,违者必究。

来源于my.cnf

#Set the default transaction isolation level. Levels available are:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE #transaction_isolation = REPEATABLE-READ

READ-UNCOMMITTED: 未提交读 会出现脏读、不可重复读、幻读 ( 隔离级别最低,并发性能高 )
READ-COMMITTED:
提交读 会出现不可重复读、幻读问题(锁定正在读取的行)
REPEATABLE-READ: 可重复读 会出幻读(锁定所读取的所有行)
SERIALIZABLE:  序列化 保证所有的情况不会发生(锁表)

 

详细说明:
     未提交读——这通常称为 ‘dirty read’:non-locking SELECT 的执行使我们不会看到一个记录的可能更早的版本;因而在这个隔离级别下是非 ‘consistent’ reads;这级隔离级别的运作如同 READ COMMITTED。处于这个隔离级的事务可以读到其他事务还没有提交的数据。如果这个事务使用其他事务未提交的变化作为计算的基础,然后那些未提交的变 化被他们的父事务撤销,则会导致误差。
     提交读——在一个事务中已经COMMIT的数据可以在其他事务中看到。如果这个事务频繁提交的话,其他的大的查询事务中可能会得到多个不同的结果。
    可重复读——这是 InnoDB 默认的事务隔离级。在一个事务中所有读都是连续的。
    序列化——提供最大程度的隔离,如果每个事务都以这种隔离级运行就会影响Mysql的性能,因为需要大量的资源来使大量事务在任一时刻不被看到。如果一个事 务在执行一个SELECT操作,另外的事务不允许执行UPDATE操作,这个隔离级别下的SELECT操作被阴式地转换为 SELECT … LOCK IN SHARE MODE。
     不可重复读的重点是修改 : 同样的条件 , 你读取过的数据 , 再次读取出来发现值不一样了 幻读的重点在于新增或者删除 同样的条件 , 第 1 次和第 2 次读出来的记录数不一样

设置事务的隔离级别:
mysql>SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

需要super优先权执行这个操作。
      取得当前事务的隔离级别: mysql>select @@tx_isolation;默认情况下,隔离级别变量的值是基于每个会话设置的,但是可以通过添加global关键字对所有的会话进行全局设置。