en udelelig TestAndSet query i mySQL ?
Problem:adskillige processer henter rækker fra en MySQL tabel og behandler dem.
to processer må ALDRIG tage fat i den samme række
i rækken er der et felt status med typen enum(parat,igang,ferdig)
Så idet en process tager fat i en række skal der ske 2 ting
1) hent rækkedata fra en række hvor status='parat'
2) opdater rækken i tabellen så status får værdien 'igang'
hvis det ikke lykkes at finde en række der er parat skal processen lægge sig til at dø.
Det kan så gøres med transactions:
mysql_query( "START TRANSACTION" );
$rs = mysql_query( "SELECT * FROM mintabel
WHERE tilstand='parat'
LIMIT 1" );
if( mysql_numrows( $rs ) == 0 ) {
mysql_query( "ROLLBACK" );
die( 'jeg er færdig\n' );
} else {
echo 'jeg fandt en ny en at ordne\n';
mysql_query( "UPDATE mintabel
SET tilstand='igang'
WHERE id={$rs['id']}" );
mysql_query( "COMMIT" );
}
Men ærlig talt, hvor klumpet skal det være.
Er der ikke en mulighed for en update kommando der samtidig henter de rækker den opdaterer i eller en select der opdaterer et felt i de rækker der hentes. En slags MySQL pendant til den TestAndSet kommando man finder i CPUerne.
mvh JakobA