###MySQL逻辑架构sql
###并发控制服务器
服务器层 :表级锁架构
存储引擎层:行级锁只有存储引擎层(InnoDB、XtraDB)实现并发
共享锁(Shared lock) 排他锁(exclusive lock) 或 读锁(read lock) 写锁(write lock)atom
####锁粒度日志
###事物 ####ACIDcode
####隔离级别blog
####死锁 定义:两个或者多个事物在统一资源上相互占用,并请求锁定对方占用的自娱啊,从而致使恶性循环的现象图片
解决方案:事务
####事物日志:提升事物效率 预写式日志(Write-Ahead Logging):修改数据时指修改内存拷贝,修改行为记录到持久在硬盘上的事物日志中,持久化之后再慢慢刷回到磁盘
ps:顺序I/O、随机I/O
####Mysql的事物 事务型的存储引擎:
自动提交AUTOCOMMIT
启用:每个查询都被看成一个事物执行提交操做 不启用:全部查询都放到一个事物中,直到COMMIT/ROLLBACK DDL语句会强制执行COMMIT,好比 ALTER TABLE等语句 设置事物隔离级别:SET TRANSACTION IOSOLATION来设置事物隔离级别 ps:同一个事物中,使用多种存储引擎时不可靠的,可能会形成非事务型表上的变动没法回滚形成数据处于不一致的状态
####多版本并发控制(MVCC,Multiversion Concurrency Control) 能够认为MVCC是行级锁的变种,可是它在不少状况下避免了加锁操做,所以开销更低,实现来非阻塞的读,写操做也只锁定必要的行
实现方式:保存数据在某个时间点的快照
InnoDB实现
每行增长两个隐藏的列实现:建立时间/过去时间<<<系统版本号 事务开始时刻的系统版本号会做为事务的版本号 REPEATABLE READ(可重复读)隔离级别下,MVCC实现 SELECT: - 行的版本号<=事物版本号:数据要么在事务开始前已经存在,要么是在事务自身插入或者修改过的 - 行的删除版本要么未定义,要么>事务版本号,确保事务读取到的行,在事务开始以前未被删除 INSERT: 保存当前系统版本号为行版本号 DELETE: 保存当前系统版本号为行删除标识 UPDATE: InnoDB为插入一行新纪录,保存当前系统版本号为行版本号,同时保存当前系统版本号到原来的行做为行删除标识
PS:MVCC只在REPEATABLE READ和READ COMMIT隔离级别下工做