票务系统逻辑

目前我们有一个票务pipe理系统,就像所有的票务系统一样,它需要以循环的方式分配给代理人。 同时,代理可以应用自己的过滤逻辑并在其队列上工作。

问题,

  1. 现在门票很大,超过一千万行。
  2. 一张票不应该分配给两个不同的用户。
  3. 为了解决上述问题,这就是我们所拥有的stream程,
  4. select查询会触发筛选条件并限制0,1
  5. 上面的查询返回的行然后根据id被选中并locking更新。
  6. 最后我们开始更新,说用户X已经select了这个案例。
  7. 虽然第3步执行其他用户不能获得相同的情况下锁,所以他们激发3.一个查询可能会多次获得下一个可用的情况。
  8. 随着用户数量的增加,这一步在第4步越来越高。

我们尝试在步骤4自己的查询中进行select更新,但是这会使整个查询变慢。 假设这是因为select查询中有大量的行。

问题,

  • 我们需要采取不同的方法吗?
  • 在存储过程中做一个select和更新确保与select更新然后更新相同的结果?

我会这样处理这个问题:

  1. 更新用户USERID处理的第一个打开的票证:

    UPDATE tickets SET processedby=USERID WHERE processedby = (SELECT id FROM tickets WHERE processedby=NULL LIMIT 0,1)

  2. 得到票

    SELECT * FROM tickets WHERE processedby=USERID

  3. 在处理完毕后更新故障单。