1章 Mysql 体系结构和存储引擎
2章 InnoDB 存储引擎
3章 文件
3.1 参数文件
3.2 日志文件
3.2.1 错误文件
3.2.2 慢查询文件
3.2.3 查询日志
3.2.4 二进制日志
3.3 套接字文件
3.4 pid 文件
3.5 表结构定义文件
3.6 InnoDB 存储引擎文件
3.6.1 表空间文件
3.6.2 重做日志文件
3.7 小结
4章 表
5章 索引与算法
6章 锁
并发时, 产生相关问题
6.1 什么是锁?
6.2 lock 和 latch
展示 lock 信息:
1 show engine innodb status
2 information_schema 表中的
innodb_trx, // 事务信息
innodb_locks, // 锁信息
innodb_lock_waits // 锁等待
// 如何 伪造数据
6.3 InnoDB 引擎中的锁
6.3.1 锁的类型
共享锁(S Lock): 允许事务读一行数据
排他锁(X Lock): 允许事务删除或更新一行数据
意向锁的两种类型 --
意向共享锁(IS Lock): 事务想要获得一张表中某几行的共享锁
意向排他锁(IX Lock): 事务想要获得一张表中某几行的排他锁
6.3.2 一致性非锁定读
//演示的例子有问题
读取数据的快照
6.3.3 一致性锁定读
select ... for update
select ... lock in share mode
6.3.4 自增长与锁
6.3.5 外键和锁
两个 Session 中, 执行父表的 x 锁,未 commit 或 rollback 时,另一个 session 的修改操作会被阻塞;
6.4 锁的算法
6.4.1 行锁的 3 种算法
Record Lock : 单个行记录上的锁
Gap Lock : 间隙锁, 锁定一个范围, 但不含记录本身
Next-Key Lock: Gap Lock + Record Lock , 锁定一个范围, 并且锁定记录本身
6.4.2 解决 Phantom Problem
两个事务中,由于一个事务的修改操作, 导致另一个事务的两次查询操作, 结果不唯一。
// 例子没有操作成功, 会话 2 的 插入操作不成功, 尽管 tx_isolation 已经设置 了 read-commited
6.5 锁的问题
6.5.1 脏读
6.5.2 不可重复读
6.5.3 丢失更新
6.6 阻塞
// 例子没有成功, 插入时有锁生成。
6.7 死锁
6.8 锁升级
6.9 小结
7章 事务
7.1 认识事务
7.1.1 概述
A 原子性,
C 一致性,
I 隔离性,也可称为并发控制, 可串行化, 锁
每个读写事务的对象对其他事务的操作对象能相互分离
D 持久性
7.1.2 分类
扁平事务
带有保存点的扁平事务
链事务
嵌套事务
分布式事务
7.2 事务的实现
redo 和 undo 不是 逆过程。
7.2.1 redo
为了持久化
innodb_flush_log_at_trx_commit
0 最快
1 最慢
2 中间
7.2.2 undo
为了事务的回滚
mysql 5.6 的 information_schema 数据库中,
找不到表 INNODB_TRX_ROLLBACK_SEGMENT, INNODB_TRX_UNDO
7.2.3 purge
用来完成最终的 delete 和 update 操作
7.2.4 group commit
一次 fsync 可以刷新确保多个事务日志被写入文件
7.3 事务控制语句
用 completion_type 来控制是否是链事务
默认为 0 , 没有任何操作, commit 和 commit work 等价
设置为 1 , commit work 自动开启一个链事务
设置为 2 , commit work 等同与 commit and release。 在事务提交胡会自动断开与服务器的连接
7.4 隐式提交的 SQL 语句
执行完相应语句后, 会有一个隐式的 commit 操作。此时 执行 rollback 将不可以回退
7.5 对于事务操作的统计
show global status like 'com_commit'
7.6 事务的隔离级别
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE
7.7 分布式事务
7.7.1 MySql 数据库分布式事务
例子: 北京的张三转 1000 块钱到 上海的李四账户
在 PHP 中的实现:http://php.net/manual/zh/mysqlnd-ms.quickstart.xa_transactions.php
7.7.2 内部 XA 事务
同一个数据库中的事务问题:
例如:写 innodb redo 日志和 binlog 日志,要保持一致性时用到
7.8 不好的事务习惯
7.8.1 在循环中提交
7.8.2 使用自动提交
7.8.3 使用自动回滚
7.9 长事务
将长事务分为若干短事务来执行。
例如:在银行系统中, 将一亿用户添加利息的操作,分为没十万个一个事务。来完成。好处是 1 不用完全回滚;2 知道进度。
7.10 小结
8章 备份与恢复
9章 性能调优
10章 引擎源代码
问题:
1 为什么事务自动提交
2 lock in share mode ? 有什么意义?
3Transactions cannot be nestedhttp://dev.mysql.com/doc/refman/5.5/en/implicit-commit.html
与层次化事务矛盾
4 分布式事务(XA) , JAVA 里有专门的库来处理, 但 PHP 里没找到相应的处理类, z
注:
查看变量
select@@innodb_undo_logs 或
show variables like 'innodb_undo_logs'
事务 -- A 原子性,C 一致性,I 隔离性,D 持久性
索引 -- 方便查找
锁 -- 并发
优化
创建存储过程
create procedure p_load(count int unsigned)
begin
end
调用: call p_load(5000)