事务
什么是事务?
事务的ACID 特性
事务并发带来的问题:
脏读: 事务A 读到了事务B 未提交的数据
不可重复读:在一个事务中两次读取的结果内容不同
幻读:一个事务中两次读取的数据行数不同
事务的四种隔离级别
innoDB 引擎对隔离级别的支持程度
锁
理解表锁与行锁
另类的行锁是指:当所有行都加上锁了,就变成了表锁
MysqlInnoDB锁类型
共享锁与排它锁对比
InnoDB锁住了什么
意向共享锁意向排它锁
自增锁AUTO-INC Locks
记录锁(Record Locks)&间隙锁(Gap Locks)&临建锁(Next-key Locks)
临建锁
innodb 选择临建锁作为默认的行锁算法,是因为临建锁可以解决幻读问题。
间隙锁
记录锁
利用锁解决并发事务产生的问题
解决脏读
解决不可重复的
解决幻读
死锁的介绍
死锁的避免
1)和 5)是避免死锁的最好策略
MVCC
ex1与ex2 的实现方式完全不同:ex1 是进行当前读,通过锁机制来解决事务并发问题(新更新)
ex1=2 是快照读,是通过MVCC方式解决幻读问题的(先查询),读取的事undoLog中的数据
mvcc 是什么?
mvcc 插入逻辑
mvcc 删除逻辑
mvcc 修改逻辑
mvcc 查询逻辑
mvcc 版本控制案例
tx1 查询到了 tx2 未提交的数据,可能出现脏读 或者幻读。
Undo Log
当前读、快照读
Redo log
Redo就是重做,以恢复操作为目的,重现操作.将最新的数据备份到一个地方叫做redo-log,不是每一次commit操作都会刷到磁盘里,操作都会进行redo log 的记录,将最新的数据记录到redo-log中,当进行commit的时候,只要这些操作记录在redo log 中就代表执行成功了,但是数据并不一定马上刷到了磁盘里面。重启mysql 它会基于Redo Log进行数据的重做,把你提交的数据全部恢复到IDB 的数据库中去。Redo Log 是为了实现事务的持久性而出现的产物。Redo 也是IO 也耗时 但是redo 是一个顺序的IO ,redo 刷数据一定是随机IO ,Redo 将耗时的操作放在后台慢慢的去做,只要记录到了redo log 里面就数据库就保证数据是持久化的。脏页 什么时候去刷,什么时候去持久化。都无关紧要,耗时的逻辑放到后台跑。
配置优化
mysql 内存参数配置
mysql 其他参数配置
数据库表设计
该条sql 语句的优化应该考虑在表中加一列,该列为price_full*100 - price * 100 的值,并在该列创建索引,来增加查询效率