В InnoDB не е необходимо изрично да стартирате или прекратявате транзакции за единични заявки, ако не сте променили настройката по подразбиране на autocommit, която е "включена". Ако автокоммитът е включен, InnoDB автоматично обхваща всяка отделна SQL заявка в транзакция, което е еквивалент на START TRANSACTION; query; COMMIT;
.
Ако изрично използвате START TRANSACTION
в InnoDB с включен автокоммит, след което всички заявки, изпълнени след START TRANSACTION
оператор или всички ще бъдат изпълнени, или всички те ще се провалят. Това е полезно в банкови среди, например:ако превеждам $500 към вашата банкова сметка, тази операция трябва да успее само ако сумата е извадена от моя банков баланс и добавена към вашата. Така че в този случай бихте изпълнили нещо като
START TRANSACTION;
UPDATE customers SET balance = balance - 500 WHERE customer = 'Daan';
UPDATE customers SET balance = balance + 500 WHERE customer = 'Dennis';
COMMIT;
Това гарантира, че и двете заявки ще се изпълняват успешно, или нито една, но не само една. Тази публикация има още малко за това кога трябва да използвате транзакции.
В InnoDB много рядко ще ви се налага да заключвате цели таблици; InnoDB, за разлика от MyISAM, поддържа заключване на ниво ред. Това означава, че клиентите не трябва да заключват цялата маса, принуждавайки други клиенти да чакат. Клиентите трябва да заключват само редовете, от които всъщност се нуждаят, позволявайки на други клиенти да продължат да имат достъп до редовете, от които се нуждаят.
Можете да прочетете повече за транзакциите в InnoDB тук . Отговорите на вашите въпроси относно блокирането са в раздели 14.2.8.8 и 14.2.8.9 на документите. Ако заявката е неуспешна, вашият MySQL драйвер ще върне съобщение за грешка, указващо причината; след това приложението ви трябва да преиздаде заявките, ако е необходимо.
И накрая, във вашия примерен код сте използвали mysql_query
. Ако пишете нов код, моля, спрете да използвате стария, бавен и остарял mysql_
библиотека за PHP и използвайте mysqli_
или вместо PDO :)