导读
- 正所谓有人(锁)的地方就有江湖(事务),人在江湖飘,怎能一无所知?
- 今天来细说一下Mysql中的三类锁,分别是全局锁、表级锁、行级锁。
全局锁
- 全局锁简单的说就是锁住整个数据库实例,命令是Flush tables with read lock。当你需要为整个数据库处于只读的状态的时候,可以使用这个命令。
- 一旦使用全局锁,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。
- 全局锁的使用场景大部分都是用来数据库备份。
为什么备份要加全局锁?
- 用户买东西,首先会从余额里扣除金额,然后在订单里添加商品。如果备份数据库,不加锁,并且备份顺序为先备份用余额,再备份订单商品,有可能备份了用户余额后,用户下订单买东西提交事务,然后再备份订单商品表, 此时订单商品已存在。最后备份出来的数据为。最后用户余额为买东西前的余额,没有减少,但是订单商品却多了。演示如下图:
![ec5f5616c1f44bc88ac17ac6ebc58a74.png](https://i-blog.csdnimg.cn/blog_migrate/ce00a01a1d95f205b670c31fcdeade5f.jpeg)
- 这种情况可能用户会觉得赚了,但是如果备份顺序反过来,先备份商品表再备份余额