我有以下问题需要解决。我需要将行插入"预订" table to,在插入时,为自己设置一个计时器,然后在几分钟后检查这个新创建的行中的一个标志,看它是否已经从" pending"到"完成" (这将是由干预期间的用户行为引起的)并且如果仍然等待"将自己从桌子上移开。
这里的想法是人们正在预订,并且开始预订过程的行为增加了这一行,但是,如果他们在一段时间内未能完成购买,我想删除行以进行预订(其他消费者可以获得有限的金额。
所以,我一直在关注事件和触发器,我得到了两者的概念,但我未能找到的是触发器传递*此行的ID的方法对于事件,以便当事件触发时它只查看相关行,因为我不希望它注意到*所有可能是"等待的行#34;因为可能有新创建的"待定"其他消费者在这段时间内进行其他预订的行,我显然不想在他们各自的计时器过去之前搞砸那些。
所以...我希望(伪)是......
/*EVENT*/
CREATE EVENT IF NOT EXISTS delete_abandoned_pending_purchase
ON SCHEDULE AT CURRENT_TIMESTAMP + 5 minutes
DO
delete from tickets where state = 'PENDING' and id = [MY ROW ID]
然后......
/*trigger*/
CREATE TRIGGER remove_if_unused
AFTER INSERT ON `tickets` FOR EACH ROW
begin
[call delete_abandoned_pending_purchase with row_id MY_NEW_ROW_ID]
end
我猜我可能需要创建一个带参数的存储过程,然后将该行ID作为参数传递?或许还有更直接的方式......我只是没有找到这个的语法,并且会喜欢一些指导。显然,我可以在包含这种数据交互的业务逻辑中处理这个问题,但我觉得这是一种更优雅的方法。
[编辑]
reading more about this "没有办法直接将参数传递给事件或从事件中传递参数;但是,可以在事件"。
中调用带有参数的存储例程但建议是调用存储过程并传递一个参数。但是,我的问题是我没有看到如何在事件中的row.id获取*以传递给存储过程。我觉得我必须遗漏一些明显的东西......事件如何才能访问特定的行ID?
[编辑编辑] 所以,基于this我感觉到这在mySQL中实际上是不可行的......这是一个令人失望的事情也非常令人惊讶。看起来似乎是一件非常明显的事情。
我会打开这个问题,看看是否有人用一个聪明的替代方案。
答案 0 :(得分:1)
我建议您通过脚本执行此操作,降低复杂性并提高控制力。如下所示:
MaxSleep=300 # In seconds SleepTime=MaxSleep
while (1) {
sleep SleepTime; delete from TheTable where reserved = 'pending' and the_timestamp >= Current_Timestamp; SleepTime='mysql
'select the_timestamp from TheTable where reserved = 'pending' order
by the_timestamp limit 1"
if SleepTime is null then SleepTime= MaxSleep
}
答案 1 :(得分:0)
你可以做一个检查整个表的事件,如果它被正确索引,那么它应该很快,然后业务逻辑在数据库中。也许使用一分钟作为检查,然后最大挂起交易是6分钟,如果你有5分钟的超时。
创建事件delete_abandoned_pending_purchase 在CURRENT_TIMESTAMP + INTERVAL 1分钟的时间表 做 开始 从TheTable中删除保留='待定'和the_timestamp> = Current_Timestamp; 结束