- 行锁 (innodb 行级锁并不是直接锁记录,而是锁索引,如果一条SQL语句用到了主键索引,mysql会锁住主键索引;如果一条语句操作了非主键索引,mysql会先锁住非主键索引,再锁定主键索引。)
- 行锁必须有索引才能实现,否则会自动锁全表,那么就不是行锁了。
1. 假设有两个事务 A ,B。当A 事务通过索引列 update了id=1的数据时,id =1列被锁定,B事务需要等事务A 释放id=1的行锁才能对id=1这行数据做写操作,同样的如果B事务通过非索引列查询对id=1这行数据做写操作会获取表锁 ,但是因为A持有id=1的行锁,所以也需要等事务A释放才能操作。 但是事务B可以对其他列执行update操作,可以执行insert操作。
2. 同样的,如果事务A 获取了表锁,那么B事务如果想要做写入(insert, update)操作必须等到事务A 释放了表锁才能执行成功
**事务中查询是不加锁的**