https://blog.csdn.net/qq_40174198/article/details/111835482
锁是计算机协调多个进程或线程并发访问某一资源的机制,应该都不陌生。但在这之前我们先来看看并发控制,理清MVCC多版本并发控制和锁的关系,这也是之前我很迷惑的一个点
在数据库中,数据可以允许多个用户同时访问,因此在并发场景下需要确保数据的一致性,可以简单梳理一下,并发场景有三种:
从宽泛意义上讲,目前有三种并发控制技术:
悲观并发控制(PCC):心态悲观,假定多用户并发的事物在处理时都会引起并发冲突,每次操作数据的时候都会上锁
先取锁再访问的策略,为数据的安全提供了保证,但是加锁会产生额外的开销,增加死锁的机会,只读型事物不会产生冲突也不需要加锁
乐观并发(OCC):心态乐观,假定多用户并发的事物在处理时不会彼此互相影响,只在提交时检查有没有其它事物修改了该数据
可以获得更大的吞吐量,但是发生冲突事物就会回滚重新执行
多版本并发(MVCC):每个写操作都会创建一个新版本的数据,读操作根据可见性规则返回其中一个数据快照
读 - 写冲突不加锁,非阻塞读的同时避免了脏读和不可重复读,但需要管理和挑选数据版本
对并发控制有了一定的了解,但需要注意:
MySQL中实现多版本两阶段锁协议,也就是MVCC+2PL(2PL是悲观并发实现的一种算法,锁只有在commit或rollback的时候释放)
再总结一下: