前言:
写一下关于最近接触到的问题.
正文:
间隙锁问题: 间隙锁产生原因检索范围或者不存在的记录. 例如 检索id 为1-8,或者检索 id = 16 但此记录不存在.
无论rc还是rr隔离级别,检索不存在的记录都会产生间隙锁(即使是非范围的索引).锁定的范围是上一个id索引存在记录到下一个索引存在记录如 id = 13 存在 id = 17存在,那么该间隙锁范围为13-17,如果为自增主键,及时读锁住 id=16 这条记录将会导致 id>16不可插入,直到事务结束或者锁超时.
所以说在使用及时读来查询一个不存在记录的时候特别注意索引目标周围是否存在记录.否则可能出现大问题. 唯一性的数据尽量使用索引来保证. 考虑并发情况下使用及时读来查询是否存在不存在时插入是有风险的.