[lug] MySQL work queue problem
George Sexton
gsexton at mhsoftware.com
Fri Oct 6 14:32:08 MDT 2006
The problem is in your where clause. You need to use something like:
update table set status_field=1 where status_field=0 and rec_id=34
if rowcount_updated()>0
then this thread was the one that got it.
do the processing.
end if
If a second thread tries the update statement, the row count will be 0
because the status field has already been changed. That's assuming that
MySQL can actually atomically update records...
Jason Vallery wrote:
> Hey All,
>
> I know this isn't exactly the best place to ask this question, but I
> know several of you out there do a bit of work with MySQL so I am sure
> someone has the answer.
>
> I've got an application that uses a MySQL table (Using the MyISAM
> engine) to store a work queue for several worker threads. Basically
> the idea is that I have a number of threads that constantly monitor
> the table. There is a status column in the table that contains an
> integer. There are four possible values:
>
> 0 = Not processed
> 1 = Processed
> 2 = In process
> 9 = Processing failed
>
> The worker threads monitor the table for any rows that have a status
> of 0. They grab the oldest record with a status of 0 and then update
> the status to 2 "in process". The thread then completes the work and
> updates the row to 1 "processed" unless it fails.
>
> The problem is however that because I have so many threads I
> occasionally run into the situation where the SELECT statements are
> executed so close together that the UPDATE statement to change the
> status from 0 to 2 doesn't happen before another thread gets the same
> job. This has lead to several issues for me (which I don't really
> need to get into). I need to come up with some way that MySQL can
> hand off the row to my thread and immediately update the status column
> to 2 so that the same row doesn't get assigned to more than one thread.
>
> I'm pretty sure I could do this if I changed the table engine to
> InnoDB because it directly supports row level locking. This
> introduces several other issues for my app though (mainly around
> performance) so I would prefer to stick with MyISAM.
>
> Thanks all in advance for any suggestions.
>
> -Jason
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Web Page: http://lug.boulder.co.us
> Mailing List: http://lists.lug.boulder.co.us/mailman/listinfo/lug
> Join us on IRC: lug.boulder.co.us port=6667 channel=#colug
--
George Sexton
MH Software, Inc.
Voice: +1 303 438 9585
URL: http://www.mhsoftware.com/
More information about the LUG
mailing list