MySQL 锁

数据库层面锁

表锁

锁定一张表的全部记录

SELECT username FROM user FOR UPDATE;

行锁

锁定一行记录

SELECT username FROM user WHERE id = 1 FOR UPDATE;

所以说在InnoDB引擎中,虽然默认为ROW LOCK但是也是在指定检索条件为主键的情况下,否则默认TABLE LOCK

页锁

行锁锁定一行记录,表锁锁定一张表中全部记录,页锁即折中。锁定相邻的一组记录。

共享锁

共享锁也称为读锁,即给数据添加读锁后,其他线程只能读取不能修改。如果有修改操作会被阻塞,进入队列

需要注意的是:
SELECT username FROM user WHERE id = 1 FOR UPDATE; 当抢锁的时候即便是普通的查询也会进入阻塞队列中。

这样就可并发正常查询:SELECT username FROM user WHERE id = 1;

排他锁

排他锁也称为写锁,和共享锁的区别在于,其他线程既不能读也不能修改。

业务处理层面思想

乐观锁

其实并不会加锁,只是也算是一种处理方式。顾名思义,这种情况认为不会发生并发冲突。抢占资源的情况,在数据库中通过添加version时间戳的方式来控制数据的版本。1.首先查询数据拿到verison 2.更新数据 3.查询数据对比version是否有变(并发冲突) 4.没有那么更新成功(COMMIT),如果有那么知道有其他线程进行了DML操作。回滚(ROLL BACK)

悲观锁

假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。悲观锁的具体实现即数据库层面的共享锁和排它锁。也只有数据库层面的锁能做到真正对数据的并发控制,多个系统之间并不能做到良好控制。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 当一个系统访问量上来的时候,不只是数据库性能瓶颈问题了,数据库数据安全也会浮现,这时候合理使用数据库锁机制就显得异...
    初来的雨天阅读 3,624评论 0 22
  • 悲观锁与乐观锁: 悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁...
    像敏锐的狗阅读 290评论 0 0
  • MySQL的事务支持 MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关: MyISAM:不支...
    但莫阅读 533评论 0 6
  • MySQL中主要有两种锁:行级锁和表级锁:行级锁(row-level):特点是锁定对象的粒度小,发生锁定资源争用的...
    田真的架构人生阅读 876评论 0 1
  • 小飞_小飞阅读 146评论 0 0