频道栏目
首页 > 资讯 > MySQL > 正文

Mysql之事务

15-08-11        来源:[db:作者]  
收藏   我要投稿

简述事务的概念:

为什么引入事务?

当我们有时候需要执行好多条语句的时候,由于某些原因,导致只有第一条语句执行了,那产生的结果就是千差万别的。

事务的特性是ACID

原子性(Atomicity)

事务是数据库的逻辑工作单位,事务中包含的操作要么都执行,要么都不执行。

一致性(Consistent):

事务执行的结果必须是从一个一致性状态迁移到另一个一致性状态。(网上找到的一段话:一致性就是数据库的数据状态符合数据库所描述的业务逻辑和规则)。A账户增加100 B账户就要减少100 这就是一致性 ,保证他的操作 就是俩个更新同时执行成功,否则一起失败!如果一个执行失败,那么就会产生不一致性,平白无故多了或少了100元,数据库状态就处于不一致状态。

隔离性(Isolation):

一个事务的执行不能被其他事务干扰,一个事务内部的操作及使用的数据对并发的其他事务是隔离的,即并发执行的事务之间不能互相干扰。

 

持久性(Durable):

事务一旦提交,对数据库中数据的改变是永久性的,其余任何故障也能够保持

并发事务带来的问题(破坏了隔离性):

更新丢失:

每个事务不知道其他事务的存在,当事务A对原数据修改后提交事务,而此时B也正在对原数据进行修改,因为A比B提交的早,所以A提交的事务会覆盖原数据,而B提交的事务会覆盖A提交的事务。

脏读:

一个事务在对某一数据修改后,然后另一个事务读取到该值,第一个事务此时由于某种原因撤销以前修改的数据,那么第二个事务读取到的值就是无效的,这些数据为脏数据。

不可重复读:

一个事务在读取数据后,再次读取该数据,发现第二次读取到的数据和第一次读取的不一致。

幻读:

一个事务按照相同检索条件重新读取以前读取过的数据,发现其他事务插入了一些满足其查询条件的新数据。这里容易和不可重复读混淆,只要记住不可重复读是指修改,侧重不一致;而幻读侧重新数据,比以前的多。

事务隔离级别:

数据库实现隔离性的方式分为两种:

悲观锁:

在读取数据前,会对其加锁,阻止其他事务对数据进行修改。

传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

乐观锁:

在读取数据前,不会加锁。但是会通过一定机制生成一个数据请求时间点的一致性数据快照文件,用这个快照来提高一定级别的一致性读取。

从用户的角度来说,好像是数据库对同一数据提供了多个版本,因此这种技术也称MVCC(数据多版本并发控制)。乐观锁适用于多读的应用类型,这样可以提高吞吐量

InnoDB中MVCC的实现:

这种数据版本记录机制实现,是给数据库表加了一个版本号(Version)字段,读取数据时,连版本号一共读取出来,当更新数据时,给此版本号加1,将提交数据的的版本号与原数据表中的版本号比较,大于才可以更新,否则认为是过期数据。

四种隔离级别比较:

隔离级别

脏读(Dirty Read)

不可重复读(NonRepeatable Read)

幻读(Phantom Read)

未提交读(Read uncommitted)

可能

可能

可能

已提交读(Read committed)

不可能

可能

可能

可重复读(Repeatable read)

不可能

不可能

可能

可串行化(Serializable )

不可能

不可能

不可能

· 未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据

· 提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)

· 可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读

· 串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

分布式事务:

Mysql从5.0.3开始支持分布式事务,当前分布式只支持InnoDB存储引擎。

我们来大致了解一下分布式事务的原理(有点像Hadoop的主从式结构):

在Mysql中,使用分布式事务的应用程序涉及一个或多个资源管理器和一个事务管理器。

资源管理器(RM):用于提供通向事务资源的途径。数据库服务器就是一种资源管理器,该管理器必须可以提交或回滚由RM管理的事务。

事务管理器(TM):用于协调作为一个分布式事务一部分的事务,TM与管理每个事务的RMs通信。

执行分布式事务分为两个阶段:

1、TM告知所有分支准备提交,分支指示是否它们可以这么做。

2、TM告知RMs是否要提交或回滚。如果在预备阶段,所有分支都指示可以提交,则所有分支被告知提交。如果在预备时,有任何分支指示不能被提交,则所有的分支都会被告知回滚。

Innodb中的事务隔离级别和锁的关系

深入浅出Mysql数据库开发、优化与管理维护.第二版
相关TAG标签
上一篇:洋码头存在重大设计缺陷影响任意用户
下一篇:sqlserver2008出现远程过程调用失败
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站