我们有一个名为account_user_device_tree的表,它在mysql中保存一个嵌套的set模型。当我们尝试向表中添加节点时,我们执行下面列出的查询。我遇到的问题是,当我们有两个独立的进程同时更新线程时,我们最终得到一个“损坏的”树,因为SELECT FOR UPDATE之后执行的SELECT查询似乎在两个会话中都执行了被SELECT FOR UPDATE阻止。
SELECT FOR UPDATE阻止其他会话继续进行,直到第一个会话执行提交或回滚?如果是这样还有什么可能导致这个树问题?
执行的查询示例集如下:
START TRANSACTION
SELECT tree_id FROM account_user_device_tree WHERE tree_id = 1 FOR UPDATE;
SELECT `tree_id`,`tree_left`,`tree_right` FROM `account_user_device_tree` WHERE `tree_id` = 9146; (this returns 'tree_id' = '9146', 'tree_left' = '20695', 'tree_right' = '20708')
// Updating the tree and add the new node at the end
UPDATE account_user_device_tree SET tree_right = tree_right + 2 WHERE tree_right >= 20708
UPDATE account_user_device_tree SET tree_left = tree_left + 2 WHERE tree_left > 20708
INSERT INTO account_user_device_tree (tree_left,tree_right) VALUES ('20708','20708' + 1)
COMMIT
account_user_device_tree表位于InnoDB引擎中。事务隔离级别为READ_COMMITTED。 AutoCommit在全局变量中设置为ON。