这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
前言:
本篇文章是我关于MySQL的第四篇文章,水平一般、能力有限。文章写的比较浅,适合新手来看。本篇主要来简单介绍MySQL在并发上的控制。当然了并发这个话题太大了,一百篇文章应该都讲不完😂。本文只是简单讨论一下。
一. 数据库的并发问题
1.并发问题如何发生呢?
很常见的问题,假如两个连接要在同一时刻修改同一条数据,就会产生这样的并发问题。
更方便你们理解,大家可以把这个想象成:卫生间只有一个空余的坑位了,但是两个人特别着急抢着去。很明显正常情况下一个坑位是无法支持两个人同时进行的。这个就是日常生活中的并发问题。
2.不做并发控制会怎么样?
还是拿上厕所来举例,如果两个人都特别着急想上。无非就是两个结果,要么两个人一起挤进去变成薛定谔的厕所,要么结果是大雄刚进去就被胖虎拖出来了。
这两种情况肯定都是不允许的,于是数据库设计出了锁的概念。
这个时候大雄进去就可以把门上锁。而胖虎需要一直等到大雄结束,然后把锁打开他才可以进去。
二. 读写锁
跟写不同,读数据是不会有并发问题的。就算多连接同时从数据库中查询数据。一般来说也不会有问题,因为读数据是不会修改原始数据的。但是如果一个连接在读取,一个连接在修改的话。这个时候就会出问题。
就像大家小时候聚在一起看电视,正在看的时候家长用遥控器把少儿频道换成了CCTV12。这当然不是我们想看到的情况。🤷♂️
解决上面遇到的并发问题其实并不难,数据库对此都提供锁的解决方法。在处理读写问题时,可以用两种类型的锁来解决。这俩种类型的锁分别是共享锁(share lock) 和 排他锁(exclusive lock),也被称之为读锁(read lock)和写锁(write lock)
1. 读锁
读锁是共享的,也就是互相不会阻塞的。多个客户可以在同一时间读取同一个资源,互不打扰。
就像几个人共用一个视频软件账号,一起看视频是可以的,就算同一时间看一个视频也不会有影响。(吃饭逛街舍得花钱,视频软件会员借来借的当代年轻人现状😏)
2. 写锁
写锁是排他的,也就是在一个写锁生效时,为了安全考虑,会阻塞其他的写锁和读锁。这样才能保证同一时间只有一个写入人。并且其他用户不会读取到错误的资源。
🎈结语:事实上,学习数据库的锁和并发控制是数据库设计的基础。粗糙的设计会导致很多的性能问题。关于颗粒度和事务等在后面的文章中更新。
本文参考资料
- 《高性能MySQL》