在前面的一篇文章里面我有介绍到关于mysql的事务,比如可重复读,读提交。然后今天这篇文章我们主要介绍一下关于mysql的锁,在编程语言中也存在许多的锁,比如互斥锁,自旋锁。这些锁可以保证数据并发访问的一致性。
首先我们需要知道,数据库的并发访问从什么地方来,如果你了解数据库的架构的话,我们知道数据库在server层面有一个叫做连接器的东西, 这个连接器可以处理多个连接。
既然出现了多个连接的问题,那么我们程序猿同学肯定就需要出来解决了,我们需要为数据库设置一种并发控制手段,那么就是数据库中的锁。
mysql中的锁也是比较有意思,是基于颗粒度的,为什么说是基于颗粒度的,这是因为它就三种读写模式,分别是全局,表,行。下面我们分别介绍一下这三种锁。
首先是全局锁,顾名思义全局锁一经生效,那么整个数据库就stop the word了, 所以全局锁的使用场景就是做全局数据的备份。也就是将整个库的每个表都整出来做成文本。但是这种是存在风险的, 因为你想一下哈,如果当我们把整个数据库给锁死了,那么日志啥的都不得不到更新,可能所有的业务都停止运行了, 这就变得非常的危险了。
前面我们也提及到事务的可重复读,也可以达到这个数据库备份的效果,但是前提是数据库引擎得支持这个东西。
在mysql中我们可以使用FTWRL这个命令去加上对应的锁,使用这个命令的好处就是我们可以在客户端断开连接之后,自动的将我们的锁给释放掉,如果你使用readonly这种全局变量的方式,很可能还是会导致我们的数据库是可读的。
第二种锁,是基于表级别的,这种表锁的的语法是下面这种:
LOCK TABLES my_table WRITE;UNLOCK TABLES; #解锁
这种锁就有点那个互斥锁的感觉了。
在mysql中还有一种锁叫做元锁,这种锁就比较厉害了,在对表进行写数据的时候会自动的给加上。
最后的一个锁叫做行锁,这个玩意用来锁住一行的, 比如现在现在我们有一个事务A正在更新一行数据,而在这个时候也有另外一个事务B也在更新对应的饭,那么事务B就必须要等待事务A先完成对应的操作。

