数据库事务及MySQL InnoDB 事务
事务的四个特性
1. 原子性:要不全做,要不全不做
2. 一致性:数据库从一种状态转变为下一种一致的状态
3. 隔离性:一个事务的执行不会被另一个事务干扰
4. 持久性:事务一旦提交,结果就会被持久化到数据库
事务的实现
1. 隔离性通过Mysql InnoDB锁就可以实现,
2. 原子性、一致性、持久性通过数据库的redo和undo来完成
Undo Log
原理:
1. 为了满足事务的原子性,在操作任何数据之前,首先将数据备份到一个地方undo表空间。
2. 然后进行数据的修改。如果出现了错误或者用户执行了ROLLBACK语句,系统可以利用UndoLog中的备份将数据恢复到事务开始之前的状态。
3. 除了可以保证事务的原子性,Undo Log也可以用来辅助完成事务的持久化。
Undo Log实现原子性和持久化的事务的简化过程
假设有A、B两个数据,值分别为1,2。
A.事务开始.
B.记录A=1到undolog.
C.修改A=3.
D.记录B=2到undolog.
E.修改B=4.
F.将undolog写到磁盘。
G.将数据写到磁盘。
H.事务提交
Undo Log能同时保证原子性和持久性,有以下特点:
1. 更新记录前,记录undo log
2. 为了保证持久性,必须将数据在事务提交前写到磁盘。只要事务成功提交,数据必然已经持久化
3. Undo log必须先于数据持久化到磁盘。如果在G,H之间系统崩溃,undo log是完整的,可以用来回滚事务
4. 如果在A-F之间系统崩溃,因为数据没有持久化到磁盘。所以磁盘上的数据还是保持在事务开始前的状态
缺陷:
每个事务提交前将数据和Undo Log写入磁盘,这样会导致大量的磁盘IO,因此性能很低。
解决方法:
如果能够将数据缓存一段时间,就能减少IO提高性能。但是这样就会丧失事务的持久性。因此引入了另外一种机制来实现持久化,即Redo Log
Redo log,记录的是新数据的备份。
原理:
1. 在事务提交前,只要将Redo Log持久化即可,不需要将数据持久化。
2. 当系统崩溃时,虽然数据没有持久化,但是Redo Log已经持久化。系统可以根据RedoLog的内容,将所有数据恢复到最新的状态。
Undo+Redo
事务的简化过程,假设有A、B两个数据,值分别为1,2.
A.事务开始.
B.记录A=1到undolog.
C.修改A=3.
D.记录A=3到redolog.
E.记录B=2到undolog.
F.修改B=4.
G.记录B=4到redolog.
H.将redolog写入磁盘。
I.事务提交
Undo+Redo事务的特点:
1. 为了保证持久性,必须在事务提交前将RedoLog持久化。
2. 数据不需要在事务提交前写入磁盘,而是缓存在内存中。
3. RedoLog保证事务的持久性。
4. UndoLog保证事务的原子性。
5. 有一个隐含的特点,数据必须要晚于redolog写入持久存
Undo log 和 Redo log的区别:
理解一:
Redo log:重做日志
Undo log:撤销日志
1. 重做日志:每当有操作执行前,将数据真正更改时,先前相关操作写入重做日志。这样当断电,或者一些意外,导致后续任务无法完成时,系统恢复后,可以继续完成这些更改
2. 撤消日志:当一些更改在执行一半时,发生意外,而无法完成,则可以根据撤消日志恢复到更改之前的壮态
理解二:
redo:每次操作都先记录到redo日志中,当出现实例故障(像断电),导致数据未能更新到数据文件,则数据库重启时须redo,重新把数据更新到数据文件
undo:记录更改前的一份copy,但你系统rollback时,把这份copy重新覆盖到原来的数据
理解三:
redo:记录所有操作,用于恢复
undo:记录所有的前印象,用于回滚
一个实例表现这两个日志代表的概念:前滚与回退
比如某一时刻数据库DOWN机了,有两个事务,一个事务已经提交,另一个事务正在处理,数据库重启的时候就要根据日志进行前滚及回退,把已提交事务的更改写到数据文件,未提交事务的更改恢复到事务开始前的状态。
MySQL的读数据问题
1. 脏读:一个事务读取了另一个事务未提交的数据,而这个数据有可能回滚
2. 不可重复读:在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。
例如:事务B中对某个查询执行两次,当第一次执行完时,事务A对其数据进行了修改。事务B中再次查询时,数据发生了改变
3. 幻读:当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
事务隔离级别
1.READ UNCOMMITTED
常被成为Dirty Reads(脏读),可以说是事务上的最低隔离级别:在普通的非锁定模式下SELECT的执行使我们看到的数据可能并不是查询发起时间点的数据,因而在这个隔离度下是非Consistent Reads(一致性读);
2.READ COMMITTED
这一隔离级别下,不会出现DirtyRead,但是可能出现Non-RepeatableReads(不可重复读)和PhantomReads(幻读)。
3. REPEATABLE READ
REPEATABLE READ隔离级别是InnoDB默认的事务隔离级。在REPEATABLE READ隔离级别下,不会出现DirtyReads,也不会出现Non-Repeatable Read,但是仍然存在PhantomReads的可能性。
4.SERIALIZABLE
SERIALIZABLE隔离级别是标准事务隔离级别中的最高级别。设置为SERIALIZABLE隔离级别之后,在事务中的任何时候所看到的数据都是事务启动时刻的状态,不论在这期间有没有其他事务已经修改了某些数据并提交。所以,SERIALIZABLE事务隔离级别下,PhantomReads也不会出现。
参考:
http://xuebinbin212.blog.163.com/blog/static/1121673762013921111828684/
http://www.cnblogs.com/luxiaoxun/p/4694144.html
http://www.cnblogs.com/flysun0311/archive/2013/03/11/2953883.html
相关推荐
- **事务处理**:InnoDB支持事务处理,而MyISAM不支持。 - **行级锁定**:InnoDB支持行级锁定,提高了并发性能。 - **外键支持**:InnoDB支持外键约束,而MyISAM不支持。 - **表锁机制**:MyISAM使用表锁机制,降低...
通过上述改进,MySQL 5.6 的 InnoDB 引擎不仅提高了数据库的整体性能,还增加了许多实用的新功能,极大地满足了现代应用程序的需求。这些新特性的加入,使得 MySQL 5.6 成为了一个非常强大的数据库平台,无论是在...
4. 启动 MySQL,并自动重建 InnoDB 数据库文件和日志文件。 5. 导入前面备份的数据库文件。 在 InnoDB 中,索引文件和数据文件是一起被缓存的,这与 MyISAM 存储引擎不同。缓存的大小可以通过参数 innodb_buffer_...
### MySQL体系结构及原理(innodb)图文完美解析 #### 宏观认识 在深入探讨MySQL的体系结构及其核心组件InnoDB之前,我们先来理解几个基础概念。 1. **MySQL简介** MySQL是一种开源的关系型数据库管理系统(RDBMS)...
### MySQL_InnoDB 事务与锁详解 #### 引题:为何引入事务? 事务在数据库管理系统中扮演着极其重要的角色,其主要目的有三: 1. **数据完整性**:确保数据库中的数据始终保持一致性和正确性,避免因部分操作失败...
InnoDB作为MySQL中最常用且最重要的存储引擎,负责处理事务处理、数据完整性以及并发控制等关键任务,因此对它的深入理解对于数据库管理员和开发者至关重要。 InnoDB存储引擎是MySQL中的默认存储引擎,特别适合需要...
综上所述,《数据库原理及应用教程(MySQL版)-习题答案及解析》覆盖了数据库的基础理论、SQL语法、设计原则、事务处理、安全控制、性能优化等多个核心领域,是学习和巩固MySQL数据库知识的重要参考资料。通过解决...
### MySQL支持事务配置及启用InnoDB引擎详解 #### 一、引言 MySQL是一种广泛使用的开源关系型数据库管理系统,以其高性能、稳定性和易用性而闻名。其中,InnoDB存储引擎因其支持事务处理、行级锁定和外键等功能,...
MySQL支持多种存储引擎,其中最常用的是InnoDB,它提供了事务支持、行级锁定和外键约束等功能。 - **解析器与优化器**:负责将SQL语句解析为内部格式,并选择最优的执行计划。 - **执行器与缓存**:执行器根据优化后...
### MySQL Innodb 引擎特性详解 #### 一、MySQL Innodb 引擎概述 MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它提供了多种存储引擎以满足不同场景的需求。其中,InnoDB是最常用的一种存储引擎之一,...
MySQL InnoDB 存储引擎是 MySQL 关系数据库管理系统中最常用的存储引擎之一。InnoDB 存储引擎是 MySQL 的默认存储引擎,它提供了高性能、高可靠性的存储功能。 数据库和实例的区别 ----------------- 在 MySQL 中...
2013年在中国举办的数据库大会上,主题为“深入解析MySQL InnoDB引擎”的演讲由Calvin Sun(孙春生)进行,他当时是Twitter的高级经理,此前在Oracle和MySQL等公司拥有丰富的经验。在这次大会上,他向与会者深入解析...
同时,了解InnoDB与其他存储引擎如MyISAM的差异,以及如何处理InnoDB的死锁和表损坏问题,也是提升MySQL数据库管理能力的重要部分。在遇到InnoDB `COUNT(*)` 计算速度慢的问题时,可以考虑使用索引或优化查询语句来...
《MySQL内核:InnoDB存储引擎 卷1》由资深MySQL专家,机工畅销图书作者亲自执笔,在以往出版的两本InnoDB介绍性图书的基础之上,更深入地介绍InnoDB存储引擎的内核,例如latch、B+树索引、事务、锁等,从源代码的...
### MySQL核心Innodb存储引擎浅析—事务系统 #### 存储引擎介绍 在MySQL中,存储引擎是处理表的存储方式的核心组件之一。不同的存储引擎提供了不同的特性,如事务支持、锁定粒度等。其中,MyISAM和InnoDB是最常用...
《MySQL技术内幕:InnoDB存储引擎》是国内目前唯一的一本关于InnoDB的著作,由资深MySQL专家亲自执笔,中外数据库专家联袂推荐,权威性毋庸置疑。内容深入,从源代码的角度深度解析了InnoDB的体系结构、实现原理、...
- **InnoDB引擎优化**:InnoDB是MySQL中最常用的事务处理引擎,5.1版中对InnoDB进行了大量优化,包括更有效的行锁定,提高了并发性能。 2. **存储引擎**: - **InnoDB存储引擎**:支持事务处理,ACID(原子性、...