如果一个数据库事务发生在一个线程上,是否有办法让其他线程在尝试该事务之前检查该事务是否已经发生?我知道innoDB有行级锁,但如果事务已经在另一个线程上发生,我希望不要尝试该事务,而不是等待锁被释放后再尝试它。
为了让我的问题更清晰,解释一下我试图做的事情可能会有所帮助:
我用php创建了一个简单的抽奖,用MySQL创建了一个innoDB表。当用户加载页面以查看抽奖时,它会检查抽奖的数据库行,以查看其预定的结束时间是否已过,以及其在数据库中的“已处理”列是否为true或false。
如果抽奖需要处理,它将开始一个数据库事务,该事务在被提交并在数据库中标记为“已处理”之前大约需要5秒。如果多个用户同时加载页面,我觉得它会多次处理抽奖,这不是我想要的。理想情况下,只有在没有其他线程在处理抽奖时,它才会尝试处理抽奖,否则它什么也不会做。
我该怎么做呢?谢谢。
发布于 2014-07-02 08:35:55
您可以实现表级锁定,并处理任何后续连接,使其要么在队列中运行,要么静默失败:
https://dev.mysql.com/doc/refman/5.0/en/lock-tables.html
从MySQL文档中:
SET autocommit=0;
LOCK TABLES t1 WRITE, t2 READ, ...;
... do something with tables t1 and t2 here ...
COMMIT;
UNLOCK TABLES;https://stackoverflow.com/questions/24521163
复制相似问题