新建一张表
CREATE TABLE `stu` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`code` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_age` (`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8;
id 为主键, name和code为普通字段, age为索引字段.
插入两条测试数据如下:

(1) 以主键字段作为条件上锁
开启事物A 以id字段作为条件上锁, 操作如下

事务B执行更新 1001这条记录

操作超时更新失败.
而更新 1009 这条记录成功.

说明 以主键字段作为条件上锁,锁的是行,是表中查询命中的数据.
(2) 以索引字段作为条件上锁
开启事物A 以 age 字段作为条件上锁, 操作如下

事务B执行更新 1001这条记录

操作超时报错.
更新 1009 这条记录, 更新成功

说明和(1)一样, 以索引字段作为条件上锁, 锁住的是行, 是表中查询命中的数据.
(3) 以普通字段作为条件上锁
开启事物A, 以name字段为条件加锁

事物B更新 1001这条记录, 超时失败

再更新 1009 这条, 也是超时失败

说明, 以普通字段作为条件上锁, 锁的是表, 是表中的所有数据.
以下是三种情况的总结:
(1) 以主键字段作为条件上锁,锁的是行,是表中查询命中的数据
(2) 以索引字段作为条件上锁,锁的是行,是表中查询命中的数据
(3) 以普通字段作为条件上锁, 锁的是该表, 是表中的所有数据
and 和 or 组合条件

说明:
显示sql更新操作超时时间以及如何修改
在Navicat 中可以执行
show VARIABLES like 'innodb_lock_wait_timeout'; 显示更新操作超时时间
set innodb_lock_wait_timeout = 10; 可以修改超时时间, 单位是秒. 但是但是注意这种临时修改的方法只会在当前会话(也就是Navicat的一个查询) 中生效.