新手菜鸟的MySQL之旅(三)———— 初识事务与存储引擎

在了解存储引擎前,我们先了解什么是事务,为什么?因为你会发现很多引擎相关的描述都有提到事务。但是本章主要是对存储引擎的知识点进行总结,所以对事务只简单进行了解。

一、事务
定义:也称工作单元,是由一个或多个SQL语句所组成的操作序列,这些SQL语句作为一个完整的工作单元,要么全部执行成功,要么全部执行失败。在数据库中,通过事务来保证数据的一致性。通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)。

事务组成:
在数据库中,事务由一组相关的DML或SELECT语句,加上一个TPL语句(COMMIT、ROLLBACK)或一个DDL语句(CREATE、ALTER、DROP、TRUNCATE等)或一个DCL(GRANT、REVOKE)语句。
例:如下语句组成两个事务。
INSERT….
UPDATE….
DELETE….
SELECT….
INSERT…
COMMIT;-- 前6条语句,组成第1个事务
UPDATE…
DELETE….
CREATE… ;–后3条语句,组成第2个事务

事务处理语言:
Transaction Process Language ,简称TPL,主要用来对组成事务的DML语句的操作结果进行确认或取消。确认也就是使DML操作生效,使用提交(COMMIT)命令实现;取消也就是使DML操作失效,使用回滚(ROLLBACK)命令实现。

作用:MySQL 事务主要用于处理操作量大,复杂度高的数据。通过事务的使用,能防止数据库中出现数据不一致现象。举两个生活中的典型例子:a.如两个银行账户进行转账,涉及到两条更新操作,这两条更新操作只允许全部成功或失败,否则数据会出现不一致的现象;b.在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务。事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。

事务的四大特征:

原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

MySQL的事务处理主要有两种方法:1.用begin,rollback,commit来实现,begin开始一个事务,rollback事务回滚,commit 事务提交 2.直接用set来改变MySQL的自动提交模式,MySQL默认是自动提交的,也就是你提交一个sql,就直接执行!可以通过 set autocommit = 0 禁止自动提交, set autocommit = 1 开启自动提交 来实现事务的处理。
但要注意当用set autocommit = 0 的时候,以后所有的sql都将作为事务处理,直到用commit确认或 rollback结束,注意当结束这个事务的同时也开启了新的事务!按第一种方法只将当前的做为一个事务!

隐式结束
隐式提交:当下列任意一种情况发生时,会发生隐式提交
执行一个DDL(CREATE、ALTER、DROP、TRUNCATE、RENAME)语句;
执行一个DCL(GRANT、REVOKE)语句;

隐式回滚:当下列任意一种情况发生时,会发生隐式回滚
客户端强行退出
客户端连接到服务器端异常中断
系统崩溃

设置保存点:如果在一个事务内,想要回滚到指定位置,不是回滚到事务的起始点,可以通过保存点(SAVEPOINT)来实现。

SAVEPOINT savepointname;–定义一个保存点语句;

ROLLBACK TO savepointname;–回滚到指定保存点

注意:如上两条语句不结束事务的执行。

二、存储引擎
1.InnoDB
InnoDB是事务安全的存储引擎,也是mysql存储引擎MySQL的数据库引擎之一,现为MySQL的默认存储引擎,为MySQL AB发布binary的标准之一。

InnoDB的主要优势

  • 遵循ACID原则(atomicity原子性,consistency一致性,isolation隔离性,durability持久性),具有事务特性的能力:commit,rollback,crash-recovery
  • 仅InnoDB和NDB(Network DB clustered database engine)支持事务和MVCC
  • 行级锁和Oracle风格的读一致性,提高多用户下的并发度和性能
  • 只有通过索引条件检索数据,InnoDB才使用行级锁,否则仍然使用表锁
  • 读一致性:query时使用snapshot快照,允许其他事务进行修改,之后再根据undo log调整数据
  • 默认的隔离级别是可重复读,即同一个事务中多次读取,数据相同
  • 使用主键优化查询,主键索引是聚集索引(Clustered index,仅InnoDB支持),使查询主键时的I/O最小化
  • 聚集索引是指整个表是按照这个索引来组织的,物理存储顺序与索引顺序相同,所以聚集索引字段的修改需要很大开销
  • 支持外码约束

使用InnoDB的好处

  • 崩溃后能很好地恢复
  • 未完成的事务将根据redo log的数据重做
  • 已提交但未写入的修改,将从doublewrite buffer重做
  • 系统闲时会purge buffer
  • 维护一个内存中的buffer pool缓冲池,数据被访问时,表和索引数据会被缓存
  • 对增删改的change buffering策略,如果被修改数据的页不在缓冲池中,则这个修改可以存在change buffer中,等相应页被放进缓冲池(发生对该页的访问)时,再写入修改,称为merge
  • adaptive hash index,经常被访问的页会自动在内存建立一个哈希索引,适于=和IN的查询。buffer pool中会预留这种索引需要的内存空间。建立在已有的B树索引基础上,哈希索引可以是部分的,B树索引不需要全部缓存在缓冲池中
  • 使用checksum校验和机制检测内存或硬盘的损坏
  • InnoDB是为处理巨大数据量的最大性能设计
  • 可以在一个查询中join混用InnoDB引擎的表和其他引擎的表

2.MyISAM
适用场景:read-only or read-mostly workloads in Web and data warehousing configurations(查询效率很高,适合大量读操作的场景)

  • 支持表级锁,不支持事务
  • 将创建3个文件,一个.frm文件,一个.MYD(MYData)文件存数据,一个.MYI(MYIndex)文件存索引
  • 数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
  • 所有数据值都按小字节(low byte first)存储,因此独立于操作系统(可移植性)。但没有明显降低速度,只是需要多处理一下对齐问题,况且获取列值所花的时间不是最主要的
  • 所有数字键都按大字节(high byte first)存储,利于压缩
    BLOB和TEXT列可以创建索引
  • 每一个character列可以使用不同的字符编码
  • 会保存表的具体行数
  • 使用B树索引,string索引会被压缩,当string是索引第一项时还会压缩前缀
  • 支持真正的变长字段varchar
  • 支持并发的insert
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值