cas
(Workerman sürümü >= 3.3.0 gereklidir)
bool \GlobalData\Client::cas(string $key, mixed $old_value, mixed $new_value)
Atomik değiştirme, $old_value değerini $new_value ile değiştirir.
Sadece mevcut istemcinin son değer alımından sonra, bu anahtarın karşılık geldiği değer başka bir istemci tarafından değiştirilmediyse, değer yazılabilir.
Parametreler
$key
Anahtar değeri. (örneğin $global->abc , burada abc anahtar değeridir)
$old_value
Eski veri
$new_value
Yeni veri
Dönüş Değeri
Başarılı bir değişiklikte true, aksi takdirde false döner.
Açıklama:
Birden fazla işlem aynı paylaşılan değişken üzerinde çalıştığında, bazen eşzamanlılık sorunlarını göz önünde bulundurmak gerekir.
Örneğin, A ve B iki işlemi aynı anda bir kullanıcı listesine bir üye eklemeye çalışsın.
A ve B işlemlerinin mevcut kullanıcı listesi şu şekildedir: $global->user_list = array(1,2,3) .
A işlemi $global->user_list değişkenini işleyerek bir kullanıcı 4 ekler.
B işlemi $global->user_list değişkenini işleyerek bir kullanıcı 5 ekler.
A işlemi değişkeni $global->user_list = array(1,2,3,4) olarak başarıyla ayarlar.
B işlemi değişkeni $global->user_list = array(1,2,3,5) olarak başarıyla ayarlar.
Bu durumda B işlemi tarafından ayarlanan değişken A işlemi tarafından ayarlanan değişkeni geçersiz kılarak veri kaybına yol açar.
Yukarıdaki durum, okuma ve ayarlamanın atomik bir işlem olmaması nedeniyle eşzamanlılık sorununa yol açar.
Bu tür eşzamanlılık problemlerini çözmek için cas atomik değiştirme arayüzünü kullanabilirsiniz.
cas arayüzü bir değeri değiştirmeden önce,
değerin başka işlemler tarafından değiştirilip değiştirilmediğini kontrol etmek için $old_value kullanır,
değiştirilmişse değiştirmez, false döner. Aksi takdirde true döner. Aşağıdaki örneğe bakın.
Dikkat:
Bazı paylaşılan verilerin eşzamanlı olarak üst üste binmesi sorun olmayabilir, örneğin bir açık artırma sisteminde mevcut en yüksek teklif veya bir ürünün mevcut stok durumu gibi.
Örnek
$global = new GlobalData\Client('127.0.0.1:2207');
// Listeyi başlat
$global->user_list = array(1,2,3);
// user_list'e atomik olarak bir değer ekle
do
{
$old_value = $new_value = $global->user_list;
$new_value[] = 4;
}
while(!$global->cas('user_list', $old_value, $new_value));
var_export($global->user_list);