PHP nasıl sorgu senkronizasyon ele gerekir?

3 Cevap php

Ben bir birincil anahtar olarak otomatik artan bir alan vardır ki, bir tabloya bazı değer eklemek istiyorum. Sonra mysql_insert_id() kullanarak kimliğini almak ve başka bir tablodaki yabancı anahtar olarak bu kimliği kullanmak istiyorum. Sorun - çok düşük bir ihtimal olsa - bu ilk yerleştirilmesi ve daha sonra alınıyor arasında, başka bir ekleme böylece yanlış bir kimlik geri verilecek, ilk tabloya olur ortaya çıkabilir.

PHP otomatik olarak bu işlemek, ya da benim endişeleri geçerlidir mı? Eğer öyleyse, ben bunları nasıl aşabiliriz?

3 Cevap

mysql_insert_id () başına bağlantı bazında son eklenen id dönecektir. Yani temelde, bu sizin endişe ise, eşzamanlı komut istekleri hakkında endişelenmenize gerek yok.

Başvuru için: see the MySQL docs.

Edit:

BTW, bu oldukça kolay test edebilir.

dnm.php

<?php

    $sleep = isset( $_GET[ 'sleep' ] ) ? true : false;

    $conn = mysql_connect( /* your parameters */ );
    mysql_select_db( /* your db */, $conn );

    $sql = 'INSERT INTO yourtable(id,col1,col2) VALUES(null,"test","test")';
    mysql_query( $sql );

    if( $sleep ) sleep( 5 );

    echo mysql_insert_id();
?>

açık iki tarayıcı sekmeleri:

request this in the first:
http://localhost/dnm.php?sleep=1

request this in the second within, say, 4 seconds max:
http://localhost/dnm.php

İlk isteği size ikinci bir isteği daha az bir kimlik vermelidir.

SQL transactions neye ihtiyacınız vardır. MySQL InnoDB işlemleri destekleyen tek motorudur.

Eğer bu sorun sizi etkilemez emin olmak için kullanabileceğiniz iki genel strateji vardır. İlk olarak, (başka bir yazar da belirttiği gibi) işlemleri kullanabilirsiniz.

El Id numaralarını izlemek için Ancak bir performans açısından, daha hızlı olabilir. Siz veritabanında küresel kimliği kullanarak bunu yapabilirsiniz. Sistemde kimlikleri genel benzersiz kılan bir haddeleme numarası.

Küresel kimliği 100 olduğunu söylemek ve size 6 kimlikleri ihtiyacımız olacak biliyorum sağlar. Sonra o zaman çok üzerinde yabancı 102 veri noktası anahtar ve olan ilk giriş için 101 kullanın ... küresel kimliği tabloda küresel id satıra 106 yazmak. Büyük veri kümeleri üzerinde çalışırken bu performansı önemli ölçüde artırır.

100 yeni ekler yapmak gerekiyorsa Yani bu iyi bir fikir olabilir. Eğer sadece bir defada 6 gerekiyorsa .. hareketleri kullanmak ...

Yorumlarda jmucchiello tarafından önerildiği gibi. Sen başka bir işlem küresel kimliği girişine yazmıyor emin olmak için bir güncelleştirme deyimini kullanabilirsiniz. Gibi bir şey

güncelleme globaltable set id = 106 id = 100

Ben bu cevap aşağı modded alıyorum görebilirsiniz, ama almak için bir milyon satır varsa, bu gerçekten iyi bir stratejidir ... oh iyi ...

-FT