通过以上日志我们观察到的比较重要情况是,编号为268103的事务拥有两个锁结构(2 lock struct(s)),其中一个锁结构是意向性排它锁IX,这个锁结构一共锁定了一条记录(这条记录并不是myuser数据表中的一条记录);另外一个锁结构是排它锁(X),这个锁结构加载在主键索引上(“page no 3 n bits 152 index ‘PRIMARY’ of table ‘qiang’.’myuser’”),并且锁定了13条记录。这13条记录就是myuser数据表中的所有数据记录,并非我们最先预计的9条记录。
这就是表锁在锁定规律上的具体表现:因为不能基于索引检索查询条件,所以就只能基于聚集索引进行全表扫描。因为不能确定聚集索引上哪些Page中数据满足检索条件,所以只能用排它锁一边锁定数据一边进行检索。因为要满足事务的ACID特性,所以在事务完成执行(或错误回滚)前都不能解除锁定: