Ben bir Postgres yeni parçalar eklemek için bir php komut dosyası var. Ben oluşturulmadan önce parçası olup olmadığını kontrol etmek istiyorum. Bunu nasıl yapabilirim. Ben INTO yan zamanki INSERT kullanıyorum.
Sen SELECT
İlk, bilmek eğer gerekir INSERT
veya UPDATE
, gibi:
if (
$db->fetchOne(
'SELECT COUNT(1) FROM parts WHERE article_number = ?',
$p->article_number
)
) {
$db->update(
'parts',
$p->to_array(),
$db->quoteInto('article_number = ?', $p->article_number)
);
}
else {
$db->insert('parts', $p->to_array());
}
Milen yorumuna Re: büyük bir nokta! Varsayılan PostgreSQL işlem yalıtım düzeyi ile (READ COMMITTED
) mümkün olduğunu başka bir işlem ekler (ve taahhüt) "senin" parçası sonra SELECT
, ama önce INSERT
.
Biz inşa apps tür, biz normalde sadece (yeniden, kullanıcıyı bilgilendirmek) DB durum yakalamak ve bu konuda bir şeyler yapmak. Yoksa SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
ile gidebilirsiniz. Bkz Transaction Isolation.
Nadiren çakışmalarını bekliyoruz: iyimser yaklaşım ve sadece yenisini takın ve oluşursa teklik ihlali işlemek. Başarısız olduğunda bu geçerli işlem geçersiz olacaktır, bu yüzden bunu bir sürü iş yapıyoruz, bu ilk kontrol için faydalı olacak. Bu durumda, ben tercih ederim SELECT EXISTS(SELECT 1 ... FROM ... WHERE ...)
.
Neyse, must benzersizliği ihlali için olasılığını ele. İlk kontrol bile, eşzamanlı işlem aynı kayıt ekler ve ilk taahhüt ettiği bir olasılığı vardır.