数据库MYSQL学习系列三

  
 <代码>数据库MYSQL学习系列三 
  

三.MYSQL事务与存储引擎
3.1 -数据库事务
什么是事务
?一系列有序的数据库操作:
o要么全部成功
o要么全部回退到操作前的状态
o中间状态对其他连接不可见
?事务的基本操作:|基本操作|说明| |:- - - - - - - - - - - - - |:- - - - - - - - - - - - - | | |开始事务开始事务| | |承诺提交(全部完成)| | |滚回滚(回到初始状态)|
——开启一个事务开始事务;,或者使用(非标准sql)开始,插入t值(1 1 1);——事务结束,插入成功提交;
开始,插入t值(2,1,1),插入t值(3、1,1);插入t值(4 1 1);——事务结束,没有插入数据回滚;
开始,
插入t值(1 1 1);
保存点a1;插入t值(2,1,1);——回滚到指定的保存点回滚a1;承诺;
自动提交
? autocommit可以在会话级别设置
?每个DML操作都自动提交
? DDL永远都是自动提交,无法通过回滚回滚
事务的四个基本属性(酸)
?原子性(原子性)
?一致性(一致性)
?隔离性(隔离)
?持久性(耐久性)
事务的原子性
?包含在事务中的操作要么全部被执行,要么都不执行
?中途数据库或应用发生异常,未提交的事务都应该被回滚
事务的一致性
?数据的正确性,合理性,完整性
?数据一致性应该符合应用需要规则:
o余额不能是负数
o交易对象必须先有账号
o用户账号不能重复
?事务的结果需要满足数据的一致性约束
事物的持久性
?提交完成的事务对数据库的影响必须是永久性的
o数据库异常不会丢失事务更新
o通常认为成功写入磁盘的数据即为持久化成功
事务的持久化的实现
?数据文件持久化
o随机同步刷新(慢)
?事务日志持久化与实例恢复
o顺序同步刷新(快)→事务日志
o随机异步刷新→磁盘
o事务日志→磁盘(实例恢复)
事务的隔离性
?数据库事务在提交完成前,中间的任何数据变化对其他的事务都是不可见的。
数据库隔离现象
隔离现象描述
脏读(脏读)事务B读到事务一个尚未提交的数据变更
不可重复读(NonRepeatable读)事务B读取前后两次读取一条记录之间该记录被事务一个修改并提交,于是事务B读到了不一样的结果
幻读(幻像读)事务B按条件匹配到了若干行记录并修改。但是由于修改过程中事务一个新插入了符合条件记录,导致B更新完成后发现仍有符合条件却未被更新的记录。
数据库隔离等级
隔离等级脏读不可重复读幻读
未提交读可能可能可能
已提交读不可能可能可能
可重复读不可能不可能可能
可串行化读不可能不可能不可能
MySQL的事务隔离级别
? InnoDB默认标记为可重复读
? InnoDB并不是标准定义上的课重复读
? InnoDB默认在可重复读的基础上避免幻读
MySQL事务隔离级别设置
?可在全球/会议/下个事务,级别分别进行设置
?建议使用读承诺(同甲骨文)
?或者建议使用默认的可重复读
设置tx_isolation="——设置隔离级别
事务与并发写
?某个正在更新的记录再提交或回滚前不能被其他事务同时更新
事务回滚的实现
?回滚段(回滚段)与数据前像
3.2 -存储引擎概述
MySQL程序层次架构

  

MySQL存储引擎
?有多种可选方案,可插拔,可修改存储引擎
?基于表选择使用何种存储引擎
主要存储引擎
存储引擎常用度支持事务
InnoDB主要,推荐是
MyISAM古老,偶尔有用,系统表否
内存偶尔临时表有用,纯内存否
黑洞不用来存放数据,个别特殊用处否
TokuDB新颖,个别特殊场景有奇效是
集群新颖,分布式,内存,线上不要用是
InnoDB存储引擎
?索引组织表
?支持事务
?支持行级锁
?数据块缓存
?日志持久化
?稳定可靠、性能好,线上尽量使用InnoDB
MyISAM存储引擎
?堆表
?不支持事务
?只维护索引缓存池、表数据缓存交给操作系统
?锁粒度较大
?数据文件可以直接拷贝,偶尔可能会用上
?不建议线上业务数据使用
MWMORY存储引擎
?数据全内存存放,无法持久化
?性能较高
?不支持事务
?适合偶尔作为临时表使用
?创建临时表tmp (int id)引擎=内存;
黑洞存储引擎
?数据不作任何存储
?利用MySQL复制,充当日志服务器
?在MySQL复制环境中充当代理主
TokuDB
?分形树存储结构
?支持事务
?行锁
?压缩效率较高
?适合大批量插入的场景

数据库MYSQL学习系列三