锁定某一行还可以用lock in share mode(共享锁)和for update(排他锁),例如:select * from table where id=1 for update,这样其他session只能读这行数据,修改则会被阻塞,直到锁定行的session提交。
4)案例结论
InnoDB存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面所带来的性能损耗可能比表级锁定会要更高一下,但是在整体并发处理能力方面要远远优于MyISAM的表级锁定的。当系统并发量高的时候,InnoDB的整体性能和MyISAM相比就会有比较明显的优势了。但是,InnoDB的行级锁同样也有其脆弱的一面,当我们使用不当的时候,可能会让InnoDB的整体性能表现不仅不能比MyISAM高,甚至可能会更差。
5)行锁分析
通过检查InnoDB_row_lock状态变量来分析系统上的行锁的争夺情况:show status like 'innodb_row_lock%'。
6)死锁
set tx_isolation='repeatable-read';
session_1执行:select * from account where id=1 for update;
session_2执行:select * from account where id=2 for update;
session_1执行:select * from account where id=2 for update;
session_2执行:select * from account where id=1 for update;
查看近期死锁日志信息:show engine innodb status\G。
大多数情况MySQL可以自动检查死锁并回滚产生死锁的那个事务,但是有些情况MySQL无法自动检测死锁。
7)优化建议
尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
合理设计索引,尽量缩小锁的范围
尽可能减少检索条件,避免间隙锁