MYSQL nasıl emin satır birden fazla GÜNCEL almaz yapabilir?

4 Cevap php

Ben mutliple işçi Seçme ve güncellenmesi bir satır var.

id status 10 new 11 new 12 old 13 old

Worker selects a 'new' row and updates its status to 'old'. What if two workers select same row at the same time? I mean worker1 selects a new row, and before worker one updates its status, worker2 selects the same row?

Ben SELECT ve UPDATE bir sorgu veya başka bir yolu var mıdır?

4 Cevap

Sen okuma önce tabloyu KİLİT, ve yazılmasından sonra kilidini olabilir. Bu iki işçi aynı anda aynı kaydı güncelleme şansını ortadan kaldıracaktır.

http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

Sen KİLİT TABLOLAR kullanabilirsiniz ama bazen (pseudo-code) aşağıdaki çözümü tercih ederim:

// get 1 new row
$sql = "select * from table where status='new' limit 0, 1";
$row = mysql_query($sql);

// update it to old while making sure no one else has done that
$sql = "update table set status='old' where status='new' and id=row[id]";
mysql_query($sql);

// check
if (mysql_affected_rows() == 1)
  // status was changed
else
  // failed - someone else did it

Veritabanı depolama motoru (InnoDB, MyISAM, vb) bağlı olarak, bir kişinin bunu oynamamıza sırasında tabloyu kilitlemek mümkün olabilir. Daha sonra aynı masaya simotanious eylemleri devam edecek.

Bir kilit ima etmek PHP mantık koşulları koyabilirsiniz? Gibi bir güncelleme yapmadan ikinci kullanıcı önleyecek bir satırda bir durum niteliğini ayarlayın. Bu muhtemelen emin satır kilitli olmadığından emin olmak için bir güncellemeden önce veritabanı sorgulama gerektirir.