暂停一个会话但继续处理其他会话

我想让mysql-proxy lua脚本处理对网站的交错访问(例如两个不同的浏览器窗口/用户),但能够暂停/延迟其中一个而不影响另一个。在mysql-proxy lua中交错处理会话是可能的(就像以后列出的输出所示),但一旦我开始延迟脚本,它就会阻塞一切,另一个会话也无法继续进行。

-- 指示应在该执行中延迟/挂起的会话/连接的查询
local qoi = "SELECT loginattempts,uid FROM mybb_users WHERE username='user1' LIMIT 1"

function read_query(packet)
        if string.byte(packet) == proxy.COM_QUERY then
                query = packet:sub(2)
                start_time = os.time()
                if query == qoi then
                        print("繁忙等待")
                        while os.time() < start_time + 20 do
                                --nothing
                        end
                        print("繁忙等待结束")
                end
                print("连接 id: " .. proxy.connection.server.thread_id)
        end
end

然而,这个脚本最终的输出结果为:

连接 id: 36
繁忙等待
繁忙等待结束
连接 id: 36
连接 id: 36
连接 id: 36
连接 id: 37
连接 id: 37
连接 id: 36
连接 id: 36
连接 id: 36
连接 id: 37

而不是预期的结果:

连接 id: 36
繁忙等待
连接 id: 37
连接 id: 37
繁忙等待结束
连接 id: 36

我的意图可行吗?如果可以,怎么做?

点赞
用户919434
用户919434

似乎在 Lua 中延迟会话是不可能的,但如果使用 MySQL 服务器来外包延迟,这同样有效,因为它也会强制交错。

local DEBUG = true

local qoi = "SELECT loginattempts,uid FROM mybb_users WHERE username='user1' LIMIT 1"

function read_query(packet)
        ret = nil
        comp_query = qoi
        if string.byte(packet) == proxy.COM_QUERY then
                query = packet:sub(2)
                if query == comp_query then
                        if DEBUG then
                                print("found matching query " .. packet:sub(2))
                                print("insert sleep")
                        end
                        inj_query = "SELECT sleep(30);"
                        new_packet = string.char(proxy.COM_QUERY) .. inj_query
                        proxy.queries:append(1, new_packet, { resultset_is_needed = true })
                        proxy.queries:append(2, packet, { resultset_is_needed = true })
                        ret = proxy.PROXY_SEND_QUERY
                end
        end
        return ret
end

function read_query_result(inj)
        if inj.id == 1 then
                if DEBUG then
                        print("sleep query returns")
                end
                return proxy.PROXY_IGNORE_RESULT
        end
        if inj.id == 2 then
                if DEBUG then
                        print("regular query returns")
                end
                return
        end
        return
end
2017-07-27 14:17:06