Mysql 事务级别说明
时间:2008-11-27 来源:Coolriver
Mysql 事务级别说明
作/译者:吴炳锡 来源:http://coolriver.cublog.cn,wubingxi#gmail.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究。
来源于my.cnf
[code]
# Set the default transaction isolation level. Levels available are:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
transaction_isolation = REPEATABLE-READ
[/code] 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关键字对所有的会话进行全局设置。
作/译者:吴炳锡 来源:http://coolriver.cublog.cn,wubingxi#gmail.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究。
来源于my.cnf
[code]
# Set the default transaction isolation level. Levels available are:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
transaction_isolation = REPEATABLE-READ
[/code] 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关键字对所有的会话进行全局设置。
相关阅读 更多 +