Ben maç yaptı kullanıcıyı tanımlamak için satır güncellemek, sonra bir maç için bir satır, bir test kullanıcı girişi çekmek için gereken bir veritabanı tablo var. Bir yarış durumu ortaya çıktığında, ben ilk kullanıcının güncelleme başka bir kullanıcı tarafından üzerine olmadığından emin olmak gerekir.
To accomplish this I intend to:
1. Read row
2. Lock table
3. Read row again and compare to original row
4. If rows match update, otherwise do nothing (another user has already updated the row)
Google'da bulunan bilgilere dayanarak, ben bir kilit edinilen kadar engellemek için kilit tablo açıklama bekleniyor. Bana zaman elle bir yarış durumu oluşturmak için izin 10 saniye durak olacaktır PHP küçük bir test komut kurmak.
// attempt to increment the victor number
$aData["round_id"] = $DATABASE["round_id"];
// routine to execute a SELECT on database (ommited for brevity)
$aRound = $oRound->getInfo($aData);
echo "Initial Round Data:";
print_r($aRound);
echo "Locking...";
echo $oRound->lock();
echo "Stalling to allow for conflict...";
sleep(10);
echo "Awake...";
$aLockedRound = $oRound->getInfo($aData);
if($aRound["victor_nation"] == $aLockedRound["victor_nation"]){
$aData["victor_nation"] = $aRound["victor_nation"] + 1;
$oRound->update($aData);
echo "Incremented Victor Nation";
}
Kilit rutin olarak tanımlandığı gibidir
function lock(){
global $oDatabase;
$iReturn = 0;
// lock the table
$iReturn = $oDatabase->m_oConnection->query("LOCK TABLES round WRITE");
return $iReturn;
}
Yukarıda, $oDatabase->m_oConnection
Ben veritabanında hazır deyimleri yürütmek için kullandığınız bir mysqli bağlantısıdır.
Benim test komut çalıştırdığınızda ilk kullanıcı tekme ve "çatışma için izin vermek ... engelliyorlar", daha sonra ikinci bir komut dosyasını başlatmak için bekleyin. İkinci senaryo üzerinde Ancak, ikinci komut dosyası da ... "çatışma için izin engelliyorlar" devam ediyor, bu ... "kilitleme" de bloke etmesi beklenmektedir.
KİLİT statment (dönüş değeri yankılandı ve boştur) engelleme, ne de kilit edinme herhangi göstergesi dönen görünmüyor bu yana, ben aslında bir kilit edinme bunu bana belli değil. Ben bile, ben devam etmek nasıl emin değilim.
Herhangi bir işaretçiler?