I InnoDB behöver du inte explicit starta eller avsluta transaktioner för enstaka frågor om du inte har ändrat standardinställningen för autocommit, som är "på". Om autocommit är på, omsluter InnoDB automatiskt varje enskild SQL-fråga i en transaktion, vilket motsvarar START TRANSACTION; query; COMMIT;
.
Om du uttryckligen använder START TRANSACTION
i InnoDB med autocommit på, sedan alla frågor som körs efter en START TRANSACTION
Uttalandet kommer antingen att köras alla, eller så kommer alla att misslyckas. Detta är användbart i bankmiljöer, till exempel:om jag överför 500 USD till ditt bankkonto, bör den operationen bara lyckas om summan har dragits från mitt banksaldo och lagts till ditt. Så i det här fallet skulle du köra något liknande
START TRANSACTION;
UPDATE customers SET balance = balance - 500 WHERE customer = 'Daan';
UPDATE customers SET balance = balance + 500 WHERE customer = 'Dennis';
COMMIT;
Detta säkerställer att antingen båda frågorna kommer att köras framgångsrikt, eller ingen, men inte bara en. Detta inlägg har lite mer om när du ska använda transaktioner.
I InnoDB kommer du mycket sällan att behöva låsa hela tabeller; InnoDB, till skillnad från MyISAM, stöder låsning på radnivå. Detta innebär att klienter inte behöver låsa hela bordet, vilket tvingar andra klienter att vänta. Klienter ska bara låsa de rader de faktiskt behöver, så att andra klienter kan fortsätta att komma åt de rader de behöver.
Du kan läsa mer om InnoDB-transaktioner här . Dina frågor om låsning besvaras i avsnitten 14.2.8.8 och 14.2.8.9 av dokumenten. Om en fråga misslyckas kommer din MySQL-drivrutin att returnera ett felmeddelande som anger orsaken; din app bör sedan skicka ut frågorna på nytt om det behövs.
Slutligen, i din exempelkod använde du mysql_query
. Om du skriver ny kod, vänligen sluta använda den gamla, långsamma och föråldrade mysql_
bibliotek för PHP och använd mysqli_
eller PDO istället :)