MySQL——锁

从数据库管理的角度对锁进行划分

共享锁:共享锁也叫读锁或 S 锁,共享锁锁定的资源可以被其他用户读取,但不能修改。

例子:给 product在表上加共享锁,可以使用下面这行命令:

LOCK TABLE product READ;

注:

共享锁默认情况下是 当数据读取完毕后就会是释放

排他锁会保留到事务结束为止
 

排它锁:排它锁也叫独占锁、写锁或 X 锁。排它锁锁定的数据只允许进行锁定操作的事务使用,其他事 务无法对已锁定的数据进行查询或修改。

例子:给 product在表上加排它锁,可以使用下面这行命令:

LOCK TABLE product WRITE;

注:

这时只有获得排它锁的事务可以对 product进行查询或修改,其他事务如果想要在 product_comment 表上查询数据,则需要等待。

释放掉排它锁,使用这行命令即可。

UNLOCK TABLE;

 

当我们对数据进行更新的时候,也就是INSERT、DELETE或者UPDATE的时候,数据库也会自动使用排 它锁,防止其他事务对该数据行进行操作。

 

不同的存储引擎支持的锁粒度

 

 

行锁

表锁

Innodb

Myisam

×

 

 

 

 

 

 

 

 

表锁

 MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁。

行级锁

1.在查询语句后面增加LOCK IN SHARE MODEMysql会对查询结果中的每行都加共享锁

SELECT ... LOCK IN SHARE MODE;

 

2.在查询语句后面增加FOR UPDATEMysql会对查询结果中的每行都加排他锁

SELECT ... FOR UPDATE;

注:

  • InnoDB自动加意向锁。
  • 对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排它锁(X锁)
  • 对于普通SELECT语句,InnoDB不会加任何锁

 

意向锁

意向锁来源:当我们想要获取某个数据表的S锁的时候,需要先看下这张数据表有没有上了S锁。 如果这个数据表中的某个数据行被上了X锁,我们就无法获取表的S锁。这时需要对数据表中的行逐一排 查,检查是否有行锁,如果没有,才可以获取这张数据表的S锁。这个过程是不是有些麻烦?这里就 需要用到意向锁。比如数据表加 上意向锁,告诉其他人这个表已经有人上过X锁了,这样当其他人想要获取数据表S锁的时候,只需要了解是否有人已经获取了这个数据表的意向排他锁即可。相当于省略一步,直接告诉 你有没有锁,而省去了你去遍历后才知道被上了锁。

对某一行加上X锁时,会对该表加上IX锁,此时另一个事务要对该表加上S锁时,S与IX不兼容,S锁就加不上。如果没有IX锁,加S锁时就要对该表所有行进行遍历。

 

 

乐观锁和悲观锁

乐观锁和悲观锁并不是锁,而是锁的设计思想。

乐观锁(Optimistic Locking)认为对同一数据的并发操作不会总发生,属于小概率事件,不用每次都 对数据上锁,也就是不采用数据库自身的锁机制,而是通过程序来实现。在程序上,我们可以采用版本 号机制或者时间戳机制实现。

悲观锁(Pessimistic Locking)也是一种思想,对数据被其他事务的修改持保守态度,会通过数据库自 身的锁机制来实现,从而保证数据操作的排它性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值