2010-03-04 6 views
6

Alışkanlık dışında tüm SQL sorguları için uygulama kodumda try/catch bloklarını kullanıyorum, catch bloğunun başında bir geri alma. Ben de başarılı olanları taahhüt ediyorum. Bu SELECT s için gerekli mi? Veritabanı tarafında bir şey serbest mi? Seçim ifadeleri herhangi bir veriyi değiştirmiyor, bu yüzden biraz anlamsız görünüyor, fakat belki de farkında olmadığım bir sebep var.Başarısız SELECT ifadelerini geri almalı mıyım yoksa başarılı olanları mı işlemeli?

örn. Oracle yılında

try { 
    $results = oci_execute($statement) 
    oci_commit($connection); 
    return $results; 
} 
catch { 
    oci_rollback($connection) 
    throw new SqlException("failed"); 
} 

cevap

7

SELECT ifadeleri (bunlar SELECT FOR UPDATE olmadıkça) herhangi bir kayıt ve asla açık işlemlerini dolaylı kilit olmadı.

İşleminizde herhangi bir DML işlemi yayınlanmadıkça, işleminizi gerçekleştirip gerçekleştirmediğiniz önemli değildir.

+0

@Quassnoi: Peki, olabilir. Bir imleç açılırsa, imleç açıldığından beri uçuşta olan her işlem için bir geri alma (UNDO) tutulur. Yani eğer herhangi bir kayıt defteri açıyorsa, kötü DBA'ların korkulan ORA-01555'ten kaçınmasına yardımcı olmak için, bunları yaparken bunları kapatmak gerekir. Bazı veritabanı sistemlerinde (size bakıyorum, DB2) okuma kilitlerini ortadan kaldırmak için seçim yaptıktan sonra işlem yapmanız gerekir. Muhtemelen kodlama standardının geldiği yer ya da sadece düz paranoya. –

+0

@Adam paranoya benim durumumda –

+2

@Adam: 'UNDO', imleci tutan değil, diğer işlemler tarafından üretilir (yalnızca okuduğunu varsayarız). Diğer işlemler verileri değiştirebilir, veri sayfalarını değiştirebilir (bu durumda UNDO’nun üretilip işlemin sonuna kadar tutulacaktır) ve taahhüt (UNDO’nun serbest bırakılması ve yeniden yazılması için ücretsiz olarak işaretlenmesi)). Salt okunur bir imleçte, "ORA-01555" yalnızca, imlecin gerektirdiği verilerin, bir eşzamanlı eşzamanlı işlem tarafından üzerine yazılması durumunda oluşturulabilir. Yine, imlecin kendisi verileri kilitlemeyecek, herhangi bir 'UNDO 'üretmeyecek ve hatta ihtiyaç duyduğu UNDO'yu kilitlemeyecektir. – Quassnoi

İlgili konular