sql >> Database >  >> RDS >> Mysql

MySQL-toezegging en transactie

In InnoDB hoeft u transacties voor enkele zoekopdrachten niet expliciet te starten of te beëindigen als u de standaardinstelling van autocommit, die "aan" is, niet hebt gewijzigd. Als autocommit is ingeschakeld, sluit InnoDB automatisch elke afzonderlijke SQL-query in een transactie in, wat het equivalent is van START TRANSACTION; query; COMMIT; .

Als u expliciet START TRANSACTION . gebruikt in InnoDB met autocommit aan, daarna eventuele query's die worden uitgevoerd na een START TRANSACTION statement zullen ofwel allemaal worden uitgevoerd, of ze zullen allemaal mislukken. Dit is bijvoorbeeld handig in bankomgevingen:als ik $ 500 overboek naar uw bankrekening, mag die operatie alleen slagen als het bedrag van mijn banksaldo is afgetrokken en bij dat van u is opgeteld. Dus in dit geval zou je zoiets uitvoeren als

START TRANSACTION;
UPDATE customers SET balance = balance - 500 WHERE customer = 'Daan';
UPDATE customers SET balance = balance + 500 WHERE customer = 'Dennis';
COMMIT;

Dit zorgt ervoor dat beide query's met succes worden uitgevoerd, of geen, maar niet slechts één. Dit bericht heeft wat meer informatie over wanneer u transacties moet gebruiken.

In InnoDB hoeft u zelden hele tabellen te vergrendelen; InnoDB ondersteunt, in tegenstelling tot MyISAM, vergrendeling op rijniveau. Dit betekent dat klanten niet de hele tafel hoeven te vergrendelen, waardoor andere klanten moeten wachten. Clients moeten alleen de rijen vergrendelen die ze echt nodig hebben, zodat andere clients toegang kunnen blijven krijgen tot de rijen die ze nodig hebben.

U kunt hier . Uw vragen over deadlocking worden beantwoord in secties 14.2.8.8 en 14.2.8.9 van de documenten. Als een query mislukt, retourneert uw MySQL-stuurprogramma een foutmelding met de reden; uw app moet de query's indien nodig opnieuw uitgeven.

Ten slotte gebruikte je in je voorbeeldcode mysql_query . Als u nieuwe code schrijft, stop dan met het gebruik van de oude, trage en verouderde mysql_ bibliotheek voor PHP en gebruik mysqli_ of BOB in plaats daarvan :)




  1. Hoe kan ik XML doorgeven van C# naar een opgeslagen procedure in SQL Server 2008?

  2. MySql - langzaam verzendende gegevensfase

  3. Betere technieken voor het trimmen van voorloopnullen in SQL Server?

  4. Voeg ontbrekende gegevens van vorige maand of jaar cumulatief toe