DELETE FROM book WHERE num=11 LIMIT 3;
DELETE FROM book WHERE num=22 LIMIT 3;
其实就是把num=11和22的记录各删去3行, 然后重复“━━━━━━━━”之间的操作 竟然发现,运行update book set name=’abc’ where num=11;后,有结果出现了,说明没有被锁住, 这是为什么呢,难道2行数据和5行数据,对MySQL来说,会产生锁行和锁表两种情况吗。经过跟网友讨论和翻阅资料,仔细分析后发现: 在以上实验数据作为测试数据的情况下,由于num字段重复率太高,只有2个值,分别是11和12.而数据量相对于这两个值来说却是比较大的,是10条,5倍的关系。 那么mysql在解释sql的时候,会忽略索引,因为它的优化器发现:即使使用了索引,还是要做全表扫描,故而放弃了索引,也就没有使用行锁,却使用了表锁。简单的讲,就是MYSQL无视了你的索引,它觉得与其行锁,还不如直接表锁,毕竟它觉得表锁所花的代价比行锁来的小。以上问题即便你使用了force index强制索引,结果还是一样,永远都是表锁。 所以mysql 的行锁用起来并不是那么随心所欲的,必须要考虑索引。再看下面的例子。
SELECT id FROM items WHERE id IN (SELECT id FROM items WHERE id < 6) FOR UPDATE; --id字段加了索引 SELECT id FROM items WHERE id IN (1,2,3,4,5) FOR UPDATE;
SET sql_mode= 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
BEGIN;
SELECT restnum FROM book WHERE id =1 ; --取消排它锁, 设置restnum为unsigned UPDATE book SET restnum=restnum-1 WHERE ;
IF(UPDATE执行成功) commit;
ELSE ROLLBACK;