PHP, mysqli, ve masa kilitler?

1 Cevap php

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?

1 Cevap

Sorun Giderme: Kilitli olmayan başka bir tablo ile çalışmak için çalışarak tablo kilit başarı için test edebilirsiniz. Eğer kilidi elde ederse, kilit tablosuna dahil olmadığı bir tabloya yazmaya çalışırken bir hata oluşturmak gerekir.

Eğer alternatif çözüm düşünebilirsiniz. Bunun yerine kilitleme, nerede fıkra parçası olarak değişen unsurları içeren bir güncelleştirme gerçekleştirmek. Bunu okumak beri değişiyor veriler değiştiyse, güncelleme "başarısız" ve modifiye sıfır satır dönecektir. Bu tablo kilit ve kilitlenme dahil olmak üzere onunla gelebilir tüm dağınık dehşet, ortadan kaldırır.