mvcc多版本并发控制
问这种东西其实也算纯八股文了
数据库处理并发事务的普遍参考或者协议吧
及其类似 java 的读写锁
假设现在有多个请求并发来到数据库,请求如下:读、读、读、写、读、读、写、写、读、读
1、读-读:这个不存在任何问题
2、读-写:写会阻塞读
3、写-写:写也会阻塞写
4、写-读:读不会阻塞写
查询binlog开启状态:SHOW VARIABLES LIKE 'log_bin';
查询binlog日志条目:SHOW BINARY LOGS;
undolog
每次对数据增、删、改都会制作一条或多条undolog日志
redolog
binlog
事务特性(其实是希望事务满足的特性)
原子性:undolog实现,要么一起成功,要么一起失败
一致性:并发事务与串行执行结果一直
隔离性:事务两两互不影响
持久性:存在磁盘
隔离级别
读未提交:事务之间互相影响,其实就是没有事务,会出现脏读、脏写
读已提交:会出现很多离谱的幻读
可重复读:会出现幻读,同一事务内,一条更新语句的前后,进行select查询,会发现多出来一条数据(其实这已经是快照读遵循mvcc实现后的效果了)
串行化:没有任何问题
mvcc的理解,和它实现了哪些功能
数据库读数据有两种情况:当前读和快照读,mvcc一定是快照读
这个东西可以分成两部分就好理解了,
首先是并发控制,既然并发,那一定需要锁的控制,如果事务内查询存在共享锁,那显然,有其他事务更新数据,每次查询都不一样,这就是完全没有解决幻读问题的状态,正好是读已提交的状态。
要解决这一问题,可以使用快照读,快照就是对多版本的应用,不同并发事务只会读取对应版本的快照数据,就一定程度上解决了幻读问题。(这时候依然会有幻读是因为当前事务本质上不能影响其他已完成事务的提交操作,所以当前更新一条当前事务查不出来的数据是可以成功的)
所以,完全满足mvcc就正好是可重复读的隔离级别