1、两阶段锁
什么是两阶段锁,回答这个问题之前得知道。锁什么时候加上的,什么时候释放的。根据MySQL45讲中提到,锁是在该锁所在的事务提交完成之后才进行释放,在需要的时候加上(比如行锁,更新之前就加上)。这个就是两阶段锁协议。
2、一个A事务update的时候,另一个B事务select。那么A给某一行加上行锁,那么B在select的时候就会阻塞(读写阻塞),那么为什么依然可以查看到update之前的数据呢(MVCC与锁之间有什么关系?)
所以MVCC就是用来解决这个问题的,正如上面所说的,如果没有MVCC的存在。那么就会存在阻塞的问题。MVCC就是解决读写阻塞的问题,那么在读的时候不会加读锁,而是用”快照读”,其中主要是read-view以及undo来体现的。那么一般的增删改update、delete、insert都是”当前读”,读的都是最新版本的数据(undolog最新版本的数据)并且会加上写锁,那么其他事务增删改的时候就会阻塞,直到前一个事务commit之后才会释放锁。
大致的情况就是这样的。
