MySQL中的for update

MySQL查询的时候,也可以给查询加锁的,在使用InnoDB存储引擎的时候.我们可以在SELECT语句的最后加上for update来实现查询加锁.InnoDB默认锁的粒度是行级别的,但是如果我们在使用的时候,一个表没有主键,这个时候锁的粒度会变为表级别.下面我们将对有主键和无主键的表来进行查询锁的一个实验,看锁的粒度.

首先建立两张表,一张有主键,一张没有主键,建表语句如下

插入数据

开两个窗口,首先操作表t,这个是有主键的

再开一个窗口,来操作表t

我们看到,更新id为2的记录的时候,更新成功了.但是更新id为1的记录的时候,失败了.是因为id为1的这一条记录,被另一个窗口加了锁.也证明了,只锁定了这一条记录,因为id为2的记录,我们可以更新成功.如果锁了整个表的话,id为2的是更新不成功的.

有主键的表,InnoDB引擎的锁的粒度是行级别的,由此证明

我们再来看没有主键的表b做同样的操作

窗口一,把表b的id为1的记录给锁定了.我们再开一个窗口操作id为2的记录,看能不能更新

我们只锁了id为1的记录,并没有锁定为2的,但是同样也更新不了,说明在没有主键的表的情况下InnoDB的锁的粒度是表级别的,而不再是行级别的.

结论:InnoDB引擎在表结构当中有主键的时候,锁的粒度是行级别的,也就是行锁.在表结构当中没有主键的时候,锁的粒度是表级别的,也就是表锁.

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Captcha Code