Chinaunix首页 | 论坛 | 博客
  • 博客访问: 237678
  • 博文数量: 23
  • 博客积分: 2262
  • 博客等级: 大尉
  • 技术积分: 872
  • 用 户 组: 普通用户
  • 注册时间: 2004-12-26 15:59
文章分类

全部博文(23)

文章存档

2009年(3)

2008年(20)

分类: Mysql/postgreSQL

2008-11-27 10:46:14

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关键字对所有的会话进行全局设置。
 
阅读(863) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~