我最近想练习做一个预约系统,预约时对数据库里那行记录加for update行级锁,防止多人同时预约时数据的不正确。如果这个时候某行被加锁中,且有多人在等待着这个锁的释放。
那么,当这个锁释放后,mysql是怎么从多个等待对象中选择下一个来对那行数据进行操作,会不会有类似“惊群效应”的发生?

解决方案 »

  1.   

    可以做实验,A加了查询共享锁后,在50秒超时时间内,对BCD先后进行update操作都将阻塞。
    此时在A上查看information_schema.innodb_lock_waits表中,可以清晰的看到一组关系:
    BCD都被A阻塞了,CD被B阻塞了,D被C阻塞了。
    A提交后,是B最先执行的。
      

  2.   

    这个就是类似线程阻塞等,应该是相关事务在一个阻塞队列上,数据库会选取一个,惊群也可能发生,但是MySQL数据库发展这么久,肯定已经考虑过这个问题。