mysql里面的锁的几种形式
1、什么是锁
就是对数据的访问控制的一种技术
2、mysql里面的锁的几种形式
共享锁(读锁):加了共享锁的,大家都可以读它。
排它锁(写锁):加了排它锁的,只有加锁的这个人可以去读写它。
锁的范围:
表锁:就是把一张锁给锁住,就是表锁。myisam引擎,实现的就是表锁。表锁的颗粒大,加锁快,并发访问低
行锁:就是把一张表里面的一行锁住,就是行锁。innodb引擎,实现的就是行锁,颗粒小,加锁慢,并发访问高。
加锁的时机:
悲观锁:当我想使用数据的时候,我就认为别人有可能会使用,我就赶紧加锁。
乐观锁:当我想使用数据的时候,认为别人不会使用。那我就修改的时候才加锁。
乐观锁:
name age version
小成 3 1.0
当我们使用乐观锁的时候,想要去修改它。这个时候,我们要读取数据出来。改变这些数据。
改变之后,就要更新。但是在更新之前检查一下version号是否一致。一致就更新。不一致,就先重新获取一下数据。然后修改数据在更新。
锁冲突:
说明:
当前用户进行加锁的时候,其它用户加锁会出现锁等待的情况。
并发访问的情况:
A :对ID是1的加锁,执行访问ID是2的,出现锁等待
B :对ID是2的加锁,执行访问ID是1的,出现锁等待
这个就是锁冲突。
3、表锁myisam引擎
读锁:
开始加锁:lock tables table_name read
解锁:unlock tables
写锁:
开始加锁:lock tables table_name write
解锁:unlock tables
准备好二个人:
划分人的时候,不是以用户名来划分的,还是以session(进程)来划分。
实现读锁:myisam
当前进程读操作:可以读
其它进程读操作:可以读
当前进程写操作:不可进行写操作
其它进程写操作:出现了锁等待!
解锁:
其它进程:解锁之后,其它进程进行了操作!
读锁的时候:当前进程与其它进程,可以操作读;当前进程与其它进程,都不可以操作写。
写锁的实践:
当前进程读操作:可以操作
其它进程读操作:锁等待
当前进程写操作:更新成功
当前进程写操作:更新成功
其它进程写操作:锁等待
当前进程操作没有锁的表:
当你有锁的时候,只能操作有锁的表!
当前进程解锁:
总结:写锁的时候,当前进程是可读可写的;其它进程是不能写也不能读的。
4、行锁innodb引擎
事务(Transaction)及其ACID属性:
原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
一致性(Consistent):事务开始和完成,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构也都必须是正确的。
隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。
事务里面操作:
开始事务:
begin:
结束事务:
commit:
读锁:sql + lock in share mode
写锁:sql + for update
读锁的实践:
开始事务:
当前进程读锁:加了读锁
当前进程对id是2的加了读锁:
其它进程对id是2的加读锁:可以操作的。
当前进程对id是2的进行更新:当前进程可以更新成功!
其它进程对id是2的进行读锁操作:只要当前进程更新,就转成了写锁了。
当前进程对id是2的读操作:
解锁:提交事务!
总结:Innodb引擎的行锁,在读锁的时候,是当前进程可以读的,其它进行可以读的。但是当前进程可以进行修改,修改之后,就默认会修改成写锁;其它进程就不能读写了。
开始事务:
执行上面的对18加上一个写锁:当前进程
执行上面的对非18加一个读锁:其它进程
其它进程,查询成功,就验证了innodb引擎,加锁确定是需要索引的!
innodb总结:Innodb是有条件的行锁,当使用索引的字段值的时候,才能加上行锁,非索引字段加的是表锁。
表锁是mysql服务器实现的,不是innodb引擎实现的。所有当有表锁冲突的时候,我们的innodb引擎没有办法解决这个问题。
行锁冲突的时候,innodb引擎会自动帮助我们解决这个问题!
当我们使用范围的时候。只要范围的都会被加锁!
5、php实现锁
需求:把我们的访问人数,统计到我们表里面!
1)创建一张表,记录人数:
num字段就是把我们有多少人访问,把统计的结果,存储在这里!
2)提前数据预热:
查看一下数据:
很多时候,我们都需要把数据提前预热;因为我们的访问一但来了,这个时候,我们没有准备好数据,就只能让mysql服务器硬抗,抗不住的。
3)代码实现:
说明:我们的Mysql服务器在我们查询的时候。会自动加读锁;修改数据库的数据操作的时候,都会自动加写锁的!
多条sql语句的操作,都应该自己去加锁!
4)模拟N多人并发访问:
ab 就是一个并发软件,可以模拟很多人,同时向一台服务器发起请求!
ab -n 总数 -c 并发数 url地址
/working/httpd-2.4.29/bin/ab -n 500 -c 100 http://127.0.0.1/lock.php
查看数据库:
再来并发:
/working/httpd-2.4.29/bin/ab -n 500 -c 50 http://127.0.0.1/lock.php
查看数据库:
5)实现加锁功能,让我们的请求实现我们的效果:
ab压力测试:
查看数据库:
结果非常的满足!
6、文件锁:
ab测试:
查看数据:
我们的文件锁,也可以实现我们的效果!非常的棒的。