sql >> Database teknologi >  >> RDS >> Mysql

MySQL commit og transaktion

I InnoDB behøver du ikke eksplicit at starte eller afslutte transaktioner for enkelte forespørgsler, hvis du ikke har ændret standardindstillingen for autocommit, som er "on". Hvis autocommit er aktiveret, omslutter InnoDB automatisk hver enkelt SQL-forespørgsel i en transaktion, hvilket svarer til START TRANSACTION; query; COMMIT; .

Hvis du udtrykkeligt bruger START TRANSACTION i InnoDB med autocommit slået til, derefter udføres alle forespørgsler efter en START TRANSACTION sætningen vil enten alle blive udført, eller også vil de alle mislykkes. Dette er f.eks. nyttigt i bankmiljøer:Hvis jeg overfører 500 USD til din bankkonto, bør denne handling kun lykkes, hvis summen er blevet trukket fra min banksaldo og lagt til din. Så i dette tilfælde ville du køre noget i stil med

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

Dette sikrer, at enten begge forespørgsler kører med succes, eller ingen, men ikke kun én. Dette indlæg har noget mere om, hvornår du skal bruge transaktioner.

I InnoDB vil du meget sjældent skulle låse hele tabeller; InnoDB understøtter i modsætning til MyISAM låsning på rækkeniveau. Dette betyder, at klienter ikke behøver at låse hele bordet, hvilket tvinger andre klienter til at vente. Klienter bør kun låse de rækker, de faktisk har brug for, så andre klienter kan fortsætte med at få adgang til de rækker, de har brug for.

Du kan læse mere om InnoDB-transaktioner her . Dine spørgsmål om deadlocking besvares i afsnit 14.2.8.8 og 14.2.8.9 af dokumenterne. Hvis en forespørgsel mislykkes, vil din MySQL-driver returnere en fejlmeddelelse, der angiver årsagen; din app skal derefter genudstede forespørgslerne, hvis det kræves.

Til sidst brugte du i din eksempelkode mysql_query . Hvis du skriver ny kode, skal du stoppe med at bruge den gamle, langsomme og forældede mysql_ bibliotek til PHP og brug mysqli_ eller BOB i stedet :)




  1. Liste over NLS-parametre i Oracle-databasen

  2. Sådan skriver du UTF-8-strenge korrekt i MySQL gennem JDBC-grænsefladen

  3. Meget vedvarende /opt/lampp/bin/mysql.server:264:kill:Ingen sådan proces. Xampp/ubuntu 16.04

  4. Hvordan konverterer man rækkeværdier til kolonner med dynamiske kolonnetællinger?