Mysql
 sql >> база данни >  >> RDS >> Mysql

Единични mysql изрази атомни ли са в MyISAM и InnoDB?

Да и Не :-)

И в двата случая достъпът е сериализиран (ако приемем, че използвате транзакционен двигател като InnoDB), тъй като те удрят един и същи ред, така че няма да се намесват един в друг. С други думи, изявленията са атомна.

Въпреки това, засегнатият брой редове всъщност зависи от вашия конфигурационен набор, когато отворите връзката. Страницата за mysql_affected_rows() има да каже това (с удебелен шрифт):

И от страницата mysql_real_connect :

И така, по отношение на това, което се случва с CLIENT_FOUND_ROWS като се конфигурира, засегнатите редове за:

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

нямат нищо свързано с това дали данните са променени, само редовете съвпадащи. Това ще бъде 1 и за двете заявки.

От друга страна, ако CLIENT_FOUND_ROWS беше не зададена, втората заявка всъщност няма да променя реда (тъй като той вече е попълнен с „мръсен“) и ще има нулев брой редове.

Ако искате същото поведение независимо от тази настройка (показва само промени), можете да използвате нещо като:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Премахнете напълно MySQL Ubuntu 14.04 LTS

  2. SQL срещу MySQL:Правила относно агрегатните операции и GROUP BY

  3. php цикъл foreach и бутон addmore във формуляр

  4. Каскадното комбинирано поле на формуляра за достъп не показва нищо в падащото меню

  5. Как мога да използвам DATE() в Doctrine 2 DQL?