2011-10-12 17 views

cevap

11

Evet ve Hayır :-) Her iki durumda da

, access is serialised aynı satır isabet beri (eğer InnoDb gibi bir işlem motoru kullanıyorsanız varsayarak), bu yüzden birbirine engel olmaz. Başka bir deyişle, ifadeleri atomiktir. Bununla birlikte, etkilenen satır sayısı, bağlantıyı açtığınızda yapılandırma ayarlarınıza bağlıdır. Üste | page for mysql_affected_rows() bu (benim kalın) demek etti: GÜNCELLEME ifadeleri için

, varsayılan olarak etkilenen-satırlar değeri aslında değişti satır sayısıdır. Mysqld'ye bağlanırken mysql_real_connect() işlevine CLIENT_FOUND_ROWS işaretini belirtirseniz, etkilenen satırlar değeri satır sayısıdır "bulundu"; WHERE yan tümcesi ile eşleşir.

Ve the mysql_real_connect page den

:

CLIENT_FOUND_ROWS: sayısı değil sayısı satır değişti, (eşleme) satırları bulundu dönün. veri , yalnızca ne satırları değiştirilir olmadığını

UPDATE T1 SET C1 = 'dirty' WHERE id = 1 

ile ilgisi ilgisi var:CLIENT_FOUND_ROWS ile ne açısından Yani

etkilenen satırlar için, yapılandırılmış olan eşleşti. Bu, her iki sorgu için de 1 olur. Öte yandan

, (zaten 'kirli' ile doldurulur beri) ve sıfır satır sayısını olurdu CLIENT_FOUND_ROWSdeğil seti, ikinci sorgu aslında satır değiştirerek olacaktır eğer. Eğer InnoDb gibi bir işlem depolama motoru kullanmak durumunda

UPDATE T1 SET C1 = 'dirty' WHERE id = 1 AND C1 <> 'dirty' 
+0

Tek deyim güncellemelerinin MyIASM için atomik olmadığını söylemek mi istiyorsunuz? – Pacerier

+0

Hızlı bir google, bir iş parçacığı veya sorguyu asla öldürmediğiniz sürece MyISAM'ın çoğunlukla atomik olduğunu gösterir. http://bugs.mysql.com/bug.php?id=51193 –

+0

@sanmai: http://dev.mysql.com/doc/refman/5.5/en/innodb-locks-set.html adresinden: Kilitleme Okumak, bir GÜNCELLEME veya bir DELETE genellikle SQL deyiminin işlenmesinde taranan her indeks kaydına kayıt kilitler. – paxdiablo

3

MySQL ASİT uyumlu olup: bakılmaksızın o ayarda (sadece gösteren değişiklikler) içinde aynı davranışı isteseydim

, gibi bir şey kullanabilirsiniz. Atomikliğe ihtiyacınız varsa, ancak InnoDB tablolarını kullanmak istemiyorsanız, [bkz. MySQL kilit tabloları] (http://dev.mysql.com/doc/refman/5.1/en/lock-tables.)

İlgili konular