行锁


原理

  • InnoDB行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

造成表锁的情况(适用于隐式事务和显式事务):

  • 原因
    • select(主动加了锁的情况下),delete,update sql语句没有使用到索引,如果使用的是普通索引也有可能造成表锁,具体要看索引列上的重复数据是不是很多
  • 解决方案
    • update,delete,select(主动加锁的情况下)条件使用主键索引或者唯一索引

查看当前数据库锁的情况
show status like 'innodb_row_lock%';查看当前行锁的情况

innodb-不主动加锁的情况下

  • select不会阻塞任何操作
  • update,delete 都会被隐式加上排它锁,行级别
  • update,delete 多条记录的情况下,根据条件逐行锁定
  • insert 不会阻塞select,update,delete,至于有没有加锁,锁的机制是什么,不清楚

innodb-主动加锁 只适用于select

  • 应用声景
    • 在一个显式事务中,主要用在需要数据依存关系时来确认某行记录是否存在,并确保没有人对这个记录进行UPDATE或者DELETE操作
  • 共享锁
    • 如果当前事务也需要对该记录进行更新操作,则很有可能造成死锁
  • 排它锁
    • 如果当前事务也需要对该记录进行更新操作,则使用排它锁
  • select使用示例
     select * from t for update 排它锁
     select * from t lock in share mode 共享锁
    

results matching ""

    No results matching ""