What is the best solution to prevent picking the same value (by multiple requests)?
There are several approaches, but a simple one in pseudo code is:

Retry:
    SELECT tour_id based on (color, priority, pickedUp = false)
    if none selected, then no vacancy error
    UPDATE tour set PickedUp=true where tour_id=:tour_id and PickedUp=false
    If none updated, then retry
Do something with :tour_id


But pickedUp should probably be more than a boolean, recording who picked up the tour.  Otherwise if the "Do something" fails then the tour will appear booked in the database, but no one will know why.