MySQL的逻辑结构
并发控制
1)读锁/写锁 读锁是共享的,写锁是独占的2)粒度锁
锁策略一般是在锁开销和数据安全之间寻找平衡。
表锁:开销最小
行级锁:支持高并发处理,开销大
事务
一组原子性的SQL查询语句,或者可以看做一个工作单元START TRANSACTION 开始一个事务
COMMIT 提交事务
ROLLBACK 回滚整个事务
ACID:
1)原子性:一个事务要么全部执行,要么全部不执行
2)一致性:数据库总是从一致性状态转换到另一种一致性状态
3)隔离性:事务的结果只有在完成之后才对其他事务可见
4)持久性:一旦一个事务提交,事务所做的数据改变将是永久的
隔离级
READ UNCOMMITTED(读取未提交内容)所有事务可以看到未提交事务的执行结果,会出现脏读,幻读
READ COMMITTED(读取提交内容)不可重复读,运行同一语句两次看到结果不同,会出现幻读
REPEATABLE READ(可重读)MySQL默认事务隔离级,会出现幻读
SERIALIZABLE(可串行化)强制事务排序,解决幻读。在每个读的数据行上加锁,导致大量超时现象和锁竞争
死锁
出现两个或多个事务在同一资源上相互占用,并请求加锁时,导致的恶性循环现象。(简单解决方法,部分或者全部的方式回滚某个事务)
事务日志
存储引擎先更新数据在内存中拷贝,存储引擎数据改变记录写入事务日志(顺序IO),位于磁盘上。再把表数据更新到磁盘上
MySQL默认操作AUTOCOMMIT(自动提交),将每个查询视为一个单独事务自动执行
InnoDB通过为每个数据行增加两个隐含值来实现MVCC。隐含值记录了行的创建时间和过期时间。
存储引擎
MyISAM每个表存储为:数据文件(.MYD)和索引文件(.MYI)
表锁。支持并发插入。支持自动检查和自动修复。手工修复(CHECK TABLE .../REPAIR TABLE ...)。支持全文索引。延迟更新索引
InnoDB
所有数据存储在表空间中,采用聚簇索引
选择合适引擎考虑因素:事务,并发,备份,崩溃后恢复