PHP SQL server işlemleri

2 Cevap php

Ben tam işlemlerin fikri kavramak çalışıyorum. Bu nedenle aşağıdaki soru ... (acemi tabii, bu yüzden gülmek yok: D)

Ben (microsoft PHP SQL sürücüsü kullanarak) PHP a (basitleştirilmiş) işlem kurdunuz. Ben daha sonra bazı ekstra işleme silmek için gidiyorum satırları almak istiyorum:

sqlsrv_begin_transaction($conn);
$sql = "SELECT * FROM test WITH (XLOCK) WHERE a<10";
$statement = sqlsrv_query($conn,$sql);
$sql = "DELETE FROM test WHERE a<10";
sqlsrv_query($conn,$sql);

$result = get_result_array($statement);
sqlsrv_commit($conn);
$result2 = get_result_array($statement);

1) Ben $ sonuç ama $ result2 boş bir dizideki beklenen sonuç alabilirim. Neden?

Sonra işlem aslında idam edilmiştir çünkü $ result2 sadece bir sonuç beklenebilir. Ben $ sonucu sonuç, hafızaya 'geçici' sonucu bir tür değil aslında gerçek veritabanından bir sonucu olduğunu tahmin.

2) Bu an arasında işlem başlamış olması olabilir ve fiili işlemek, başka bir bağlantı başka bir sorgu maç (a <10) satır değişti? Bu sonuca göre $ I bekliyorum sonuçları veritabanında gerçek değişikliklerden farklı olacağı anlamına gelir.

Ya da (a) işlem (-arasındaki diğer bağlantılardan sorgular etkilenmez) veritabanının bir bellek kopya ile oluşmaz, veya (b) işlem başından beri elde kilitler için eylem zaten olmasıdır Diğer bağlantılarda diğer sorgular?

Bunu yazdıktan sonra ben cevap b bekliyorum ....?

2 Cevap

Ben sqlsrv sürücüsü ile aşina değilim, ama çoğu diğer PHP DB sürücüleri gibi bir şey çalışıyorsa, sqlsrv_query aramanın sonucu dizinin bazı şeklinde ayarlanmış bir sonuç değil, bir PHP kaynak (bkz: {[(0) ]}). Get_result_array çağırıyor hala bu durumda veritabanında, bu kaynaktan veri alır, ve bunu hemen yapar. COMMIT sadece veritabanına yazar etkiler okur değil, bu yüzden result1 içinde hemen sonuç görebilirsiniz. Eğer işlem (örneğin, DELETE) taahhüt sonra, bir sonraki çağrı doğru boş bir sonuç kümesi döndürür.

I tested it out with some mysql tools (which i'm more familiar with): 1. When I start a transaction and do a 'select' of one particular record I directly get the result. Then from an other connection I delete the same record (with autocommit) it is gone for that connection but for the first connection the record is still there (I did the 'select' again without committing the transaction). Only after committing the transaction of the first connection and doing the 'select' again the record is gone. 2. When I do the same but acquire an exclusive lock for the first 'select' query then the delete query of the second connection waits until the transaction of the first connection has been committed.

Sonuç: Bu işlemin başlaması anda olduğu gibi durumda (1) ilk bağlantıdan ikinci seçme sorgusu için, veritabanı da dikkate diğer (yazma) alarak OLMADAN ... bir sonuç döndüren sorgular SONRA çalışıyor İşlemin başlangıç. Durum (2) benim özgün sorudan tam olarak cevap 2b olduğunu. :)