iyimser ve kötümser kilitleri

2 Cevap php

Benim ilk php / Codeigniter proje üzerinde çalışıyoruz ve ben düzenleme verilere erişimi kilitleme hakkında bilgi için 'net dolaştılar ettik ve çok fazla bilgi bulamadım.

Ben 2 kullanıcı aynı anda aynı formu düzenlemek girişimi için bu oldukça normal bir olay olmasını bekliyoruz.

(BBX, filePro ve diğer RAD uygulamalar durumsal dünyasında) Benim deneyim düzenlenmekte olan verileri zamanında düzenleme forma erişimi olan bir karamsar kilit bir kullanıcı kullanarak kilitli olmasıdır. Ikinci kullanıcı temelde bitirmek için ilk beklemek zorunda. Ben bu Ajax 'kilit' veritabanını korumak için XMLHttpRequest'lerinin gönderme kullanılarak yapılabilir anlıyorum.

Php dünya devleti eksik, iyimser kilitlemeyi tercih gibi görünüyor. Ben bunu doğru anlamak eğer bu gibi çalışır: Her iki kullanıcı verilere erişmek için olsun ve onlar verilerin versiyonu 'Değişiklikleri önce' her kayıt. Yaptıkları değişiklikleri kaydetmeden önce, veriler tekrar alınır ve 'Değişiklikleri önce' versiyonu karşılaştırılır. İki sürümleri aynı ise o zaman kullanıcılar değişiklikler yazılır. Bunlar farklı ise; kullanıcı o / o düzenleme başladı ve bazı mekanizması farklılıkları veya kullanıcı 'Maalesef, tekrar deneyin' mesajı gösterilir gidermek için eklenen bu yana ne değişti gösterilmiştir.

Ben burada insanlar kötümser ve iyimser hem de kilitleme uygulanması ile olmuş herhangi bir deneyimi ilgileniyorum. Mevcut bulunuyor nasıl-kütüphaneler, araçlar, ya da 'varsa ben bir link teşekkür.

Teşekkürler

2 Cevap

As far as I know, CodeIgniter has no suppveyat of locking rows. If you want to implement optimistic locking, you should add a version column veya timestamp column that is you must change on each update/insert. Put the version column into a hidden field in your fveyams. Then befveyae each update, add a where clause like :

$this->db->where('version',$editedVersion);

veya

$this->db->where('timestamp',$editedTimestamp);

And then you should check that the update cveyarectly updated 1 rows..

$this->db->where('id',$editedId);
$this->db->update('tablename',$data);
$rowsAffected = $this->db->affected_rows();
if ($rowsAffected == 0) {
    /* Data changed by other user, update failed */
} else {
   /* updated successfully */
}

Eğer InnoDB depolama motoru kullanmak eğer GÜNCELLEME tablolar için seçtiğiniz aracılığıyla satır düzeyinde özel kilit elde edebilirsiniz.

SELECT ... FOR UPDATE and SELECT ... LOCK IN SHARE MODE Locking Reads

InnoDB Lock Modes