一. Mysql架构
1. Mysql 逻辑架构
第一层 Connection/Threading handling
↓ ↓
Query cache ← Parser
第二层 ↓
Optimizer
Storage Engines
2. 连接管理
3. 优化与执行
4. 一致性控制
5. 读锁/写锁
6. 锁粒度
分为表级锁,行级锁
大部分数据库只给出一种选择行级锁,而mysql依据不同的存储引擎来决定自己的锁
7. 事务
ACID原则
Atomicity: 原子性,操作必须是原子是原子的 it’s all or nothing
Consistency: 一致性, 事务没有commit之前数据库crash。数据要保持一致
isolation: 隔离性,两个不同的事务操作同一数据。要保证在事务没有提交之前中间数据不会影响到另一个事务
druability: 持久性,事务一旦提交,将会永久的保存。
8. 隔离性
隔离性远比我们想像的复杂,标准的SQL定义了四个隔离级别, 指定了数据在事务内部及外部改变的可见性。
READ UNCOMMITTED: 事务可以读到事务已修改但未提交的记录,可能会产生脏读(dirty read)
READ COMMITTED: 事务只能读到其它事务已提交的记录。可能会产生不可重复读(nonrepeatable read)的问题
REPEATABLE READ: 同一事务中读取数据会是相同的。事务1执行过程中。事务2插入一行新记录。然而事务1需要range row的查询。会比之前多出记录。导致幻读(phantom read)
SERIALIZABLE: 序列化,所有的事务看起来像顺序执行一样。。。很少有用户采用这种方式
9. 死锁(DeadLock)
start transaction
update a set str=’123′ where id=3;
update a set str=’234′ where id=4;
commit
start transaction
update a set str=’123′ where id=4;
update a set str=’239′ where id=3;
commit
10. 事务日志
使用write ahead logging(预写式日志),原理是顺序写比随机写效率高
11. mysql中的事务
- autocommit: 自动提交,mysql的默认设置,在非事务存储引擎中不起作用show variables like ‘%autocommit%';set autocommit=1
- mixing storage engines in transactions: 如果在一个事务中混合使用事务/非事务的表。则在rollback中。非事务表不会起作用。通常会给出warning
- innodb中使用two-phase locking,含义如下:在事务的任何阶段都可以获得锁,但直到commit或rollback时才会释放
两阶段封锁(Two-Phase Locking)
两段锁协议的内容
Innodb的锁是根据隔离等级透明实现的,但是它同样提供明确的锁:
SELECT ……… LOCK IN SHARE MODE
SELECT ……. FOR UPDATE
mysql在服务器层面实现了lock tables和unlock tables命令。
- Multiversion Concurrency Control(多版本并发控制)
它可以避免不必要的行级锁,仅仅在有写操作的时候来锁定。