InnoDB默认是行级别的锁,当有明确指定的主键时候,是行级锁。否则是表级别。
成都服务器托管,创新互联提供包括服务器租用、成都多线服务器托管、带宽租用、云主机、机柜租用、主机租用托管、CDN网站加速、域名与空间等业务的一体化完整服务。电话咨询:18980820575
例子: 假设表foods ,存在有id跟name、status三个字段,id是主键,status有索引。
例1: (明确指定主键,并且有此记录,行级锁)
例2: (明确指定主键/索引,若查无此记录,无锁)
例3: (无主键/索引,表级锁)
例4: (主键/索引不明确,表级锁)
for update的注意点
for update的疑问点
mysql 为并发事务同时对一条记录进行读写时,提出了两种解决方案:
1)使用 mvcc 的方法,实现多事务的并发读写,但是这种读只是“快照读”,一般读的是历史版本数据,还有一种是“当前读”,一般加锁实现“当前读”,或者 insert、update、delete 也是当前读。
2)使用加锁的方法,锁分为共享锁(读锁),排他锁(写锁)
快照读:就是select
当前读:特殊的读操作,插入/更新/删除操作,属于当前读,处理的都是当前的数据,需要加锁。
mysql 在 RR 级别怎么处理幻读的呢?一般来说,RR 级别通过 mvcc 机制,保证读到低于后面事务的数据。但是 select for update 不会触发 mvcc,它是当前读。如果后面事务插入数据并提交,那么在 RR 级别就会读到插入的数据。所以,mysql 使用 行锁 + gap 锁(简称 next-key 锁)来防止当前读的时候插入。
Gap Lock在InnoDB的唯一作用就是防止其他事务的插入操作,以此防止幻读的发生。
Innodb自动使用间隙锁的条件:
1、确定mysql有锁表的情况则使用以下命令查看锁表进程
2、杀掉查询结果中已经锁表的trx_mysql_thread_id
扩展:
1、查看锁的事务
2、查看等待锁的事务
3、查询是否锁表:
4、查询进程