当前位置: 首页 > 后端技术 > PHP

深入完整的理解MySQL锁

时间:2023-03-29 22:15:43 PHP

今天讲讲MySQL锁讲座:Mysql悲观锁和乐观锁官方:如果查询数据,然后在同一个事务内插入或更新相关数据,常规的SELECT语句做没有给予足够的保护。其他事务可以更新或删除您刚刚查询的相同行。InnoDB支持两种加锁读,提供额外的安全性:就是说你正常的查询sql有保护功能,也就是不加锁会有事务执行当数据乱序的时候,MySQL提供了innodb引擎支持两种加锁机制。1.悲观锁:概念:a)官方:对于搜索遇到的索引记录,SELECT…FORUPDATE锁定行和任何关联的索引条目,就像您为这些行发出UPDATE语句一样。其他事务被阻止更新这些行,执行SELECT…LOCKINSHAREMODE,或读取某些事务隔离级别的数据。一致读取忽略读取视图中存在的记录上设置的任何锁。(无法锁定旧版本的记录;通过在记录的内存副本上应用撤消日志来重建它们。拥有此锁的人可以修改和查询数据,而其他人则无能为力。使用语法:select*fromtbforupdate2。乐观锁:概念:a)官方:SELECT...LOCKINSHAREMODE在读取的行上设置共享模式锁。共享模式锁使其他会话能够读取行但不能修改它们。读取的行是最新的可用行,因此如果它们属于另一个尚未提交的事务,则读取将阻塞直到该事务结束。叠加锁,然后所有人都可以进行select操作,但是不能进行update或者delete操作(也就是修改操作)。即使大家的事务没有提交,大家也可以使用普通的select查询数据。注意:此时select没有作用使用语法:select...lockinsharemode必须注意以下内容:所有LOCKINSHAREMODE和FORUPDATE查询设置的锁在事务提交或回滚时释放。注意使用SELECTFORUPDATE锁定更新行仅在禁用自动提交时适用(通过使用STARTTRANSACTION开始事务或将自动提交设置为0。如果启用自动提交,则不锁定符合规范的行。所有锁都在业务中后退rollorreleaseafterend注意:使用select..forupdate进行行锁,仅在禁用autocommit时生效(或者在STARTTRANSACTION中或设置autocommit为0。)如果启用了autocommit,那么这一行的forupdate是不会生效的。更多精彩内容,还可以关注这个二维码: