Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1844
  • 博文数量: 3
  • 博客积分: 31
  • 博客等级: 民兵
  • 技术积分: 25
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-30 16:24
文章分类
文章存档

2012年(3)

我的朋友
最近访客

分类:

2012-05-30 16:31:20

原文地址:数据库事务 作者:alang85

数据库事务

四种隔离级

1,read uncommitted(读取未提交内容)

在read uncommitted隔离级,所有事务都可以“看到”未提交事务的执行结果。在这种级别上,可能会产生很多问题,除非用户真的知道自己在做什么,并且很多的理由选择这样做。本隔离级别很少用于实际应用,因为它的性能也不必其他级别好多少,而别地级别还有其他更多的优点。读取未提交数据,也被称之为脏读(dirty read)。

2,read committed(读取提交内容)

大多数数据库系统的默认隔离级别为read committed(但不是mysql默认的)。它满足了隔离级别早先简单定义:一个事务在开始时,只能”看见“已经提交事务所做得改变,一个事务从开始到提交前,所做得任何数据改变都是不可见的,除非已经提交。这种隔离级别也支持 所谓的”不可重复读(nonrepeatable)“,意味着用户运行同一语句两次,看到的结果是不同的。

3,repeatable read(可重读)

repeatable read隔离级解决了read uncommitted隔离级导致的问题。它却确保同一事务的多个实例在并发读取数据时,会”看到同样地“数据行。不过理论上,这会导致另外一个棘手的问题,幻读(phantom read)。简单来说,幻读指当用户读取某一个范围的数据行时,另外一个事务又在该范围内插入插入了心行,当用户在读取该范围的数据行时,会发现有新的”幻影(phantoom)“行。innodb和falcon存储引擎通过多版本并发控制(multiversion concurrency control)机制解决了幻读问题。

4,serializable(可串行化)

serializable是最高级别的隔离级,它通过强制事务顺序,使之不可能相互冲突,从而解决幻读问题。简而言之,serializable是在每个读得数据行上加锁。在这个级别,可能导致大量的超时(timeout)现象和锁竞争(lock contention)现象。

隔离级别        脏读可能性    不可重复读可能性    幻读可能性    加锁读

read uncommitted    YES        YES        YES        NO

read committed      NO         YES        YES        NO

repeatable read      NO          NO         YES        NO

serializable         NO         NO        NO        YES

 

mysql ab提供3个事务型存储引擎innodb,falcon,ndb cluster;

第三方引擎最知名:solidDB,PBXT;

mysql允许使用set transaction isolation level命令设置隔离级别,将在下一个事务开始后生效。用户可以在配置文件中设置隔离级别。当前会话设置隔离级别:

mysql>set session transaction isolation level read committed;

 

MVCC

多版本并发控制(mvcc,multiversion concurrency control)技术,不是简单地使用行加锁的机制,而是选用一种叫做mvcc的技术,和行加锁机制关联使用,以应对更多得并发处理问题。

MVCC只工作在repeatable read和read committed两个隔离级。read uncommitted隔离级不兼容MVCC,因为在任何情况下,该隔离级下地查询,不读取符合当前事务版本的数据行,而读取最新版本的数据行。serializable隔离级也不兼容MVCC,因为该级下地读操作会对每一个返回行都进行加锁。

当事务隔离级别设置为repeatable read时,MVCC在实际操作中得应用方式:

select

innodb检查每行数据,确保它们符合两个标准:

(1),innodb只查找版本早于当前事务版本的数据行(也就是数据行的版本必须小于等于事务的版本),这确保了当前事务读取的行都是在事务开始前已经存在的,或者是由当前事务创建或修改的行。

(2),数据行的删除版本必须是未定义的,或是大于事务版本的,这确保了事务读取的行,在事务开始时未被删除的。有通过上述两项测试的数据行,才会被当做查询结果返回。

update

innodb会为每个需要更新的行,建立一个新的行拷贝,并且为新的行拷贝,记录当前的系统版本号。同时,也为更新前的旧行,记录系统的版本号,作为旧行的删除版本标识。

insert

innodb为每个新增行记录当前系统版本号。

delete

innodb为单个删除行,记录当前系统版本号,作为行删除标识。

mysql锁定模型和并发级别

加锁策略        并发    系统开销      引擎

表级加锁        最低    最低        myisam,merge,memory

阅读(163) | 评论(0) | 转发(0) |
0

上一篇:oracle高级异常处理

下一篇:没有了

给主人留下些什么吧!~~