A modest wish: that our doings and dealings may be of a little more significance to life than a man's dinner-jacket is to his digestion. Yet not a little of what we describe as our achievement is, in fact, no more than a garment in which, on festive occasions, we seek to hide our nakedness.

Dag Hammarskjöld, Markings, translated by W.H. Auden and Leif Sjöberg

Recent blog entries by haruspex

fozbaca You should take that "Grammar Cheat
Sheet" with a
grain of salt. Some of it is dubious or plain wrong. To top
it off, the cutesy labels on the comment form are
excruciatingly poorly worded - so the post is not a very good
advertisement for the guide.

nconway, I don't see why people try to
solve
races like the
Doctors problem through transactions and isolation levels. Row level locking
in
InnoDB prevents the race regardless of the isolation level in use.

BEGIN;
SELECT COUNT(*) INTO @n FROM Duties WHERE Shift=@s AND Status='on
duty'
FOR UPDATE;
if @n > 1 then
UPDATE Duties SET Status='reserve' WHERE DoctorId=@d AND Shift=@s;
COMMIT;
else
ROLLBACK;

If you're not familiar with InnoDB, the SELECT establishes a critical
section
covering the on duty doctors. This same sequence executing concurrently will
block until the connection with the lock has checked the count. The COMMIT
(or ROLLBACK) will unblock the other connection waiting for the lock. In case
the first connection committed an UPDATE which reduced the count to 1, the
second connection, when unblocked, will see the new count of 1 and not
make any update.