mysql 的lock table 是给予线程的,mysql 会链接建立一个session,当一个session 发出lock table时候,其他mysql table的进程都会被lock,只允许当前session 进程进行操作,待该session 发送出 unlock解锁时候,mysql 对该表的操作才恢复正常操作。 问题来了,当nodejs 处于cluster 模式下,如果有多个业务请求lock table 的时候,传统的多线程业务框架比如Java 等就可以进行正常操作,而nodejs 的epoll 框架模型就遇到麻烦。举例来说: 如果A进程接收到2次请求都需要执行对表的唯一性读写,B进程接收到一次,那么如果A先执行lock table,因为是队列操作,会执行2次lock,这时,B进程操作就被死锁,A的第2个请求也会被堵塞。关键在于A的第一次unlock 操作,会解锁的是A第二次的lock,而不是第一次的lock,于是造成了整个表的死锁。原来在正常多线程模型中的lock table 在nodejs cluster 模式下变的不可操作。。。。除非A的lock 表,unclock 是顺序执行,这样需要对每个nodejs进程做队列。。。。真的划不来。 说到底,原来是正对于多线程的技术方案在epoll这类队列消息事件机制的服务框架中,难以使用啊!
自己终结自己问题吧,查阅一些资料,在mysql innodb 下, A locking read, an UPDATE, or a DELETE generally set record locks on every index record that is scanned in the processing of the SQL statement. It does not matter whether there are WHERE conditions in the statement that would exclude the row. InnoDB does not remember the exact WHERE condition, but only knows which index ranges were scanned. 就是当update时候,会自动行锁定数据,只要在操作时候,update 一个附加的标志位,那么下次操作时候,update 排除该标志位即可,可以视作update 还是一个原子操作的事务类型。就是锁表策略不行,需要行锁。
make