sql >> Database >  >> RDS >> Mysql

MySQL transactie raadsel

MySQL geeft wel foutcode door aan de beller en op basis van deze foutcode is de beller vrij om te beslissen of hij het tot nu toe verrichte werk wil vastleggen (de fout negerend met deze specifieke INSERT afschrift) of om de transactie terug te draaien.

Dit is anders dan PostgreSQL die de transactie altijd afbreekt bij een fout en dit gedrag is een bron van veel problemen.

Bijwerken:

Het is een slechte gewoonte om een ​​onvoorwaardelijke ROLLBACK . te gebruiken binnen de opgeslagen procedures.

Opgeslagen procedures zijn stapelbaar en transacties niet, dus een ROLLBACK binnen een geneste opgeslagen procedure wordt teruggedraaid naar het allereerste begin van de transactie, niet naar de status van de uitvoering van de opgeslagen procedure.

Als u transacties wilt gebruiken om de databasestatus bij fouten te herstellen, gebruikt u SAVEPOINT constructies en DECLARE HANDLER om terug te gaan naar de opslagpunten:

CREATE PROCEDURE prc_work()
BEGIN
        DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_prc_work;
        SAVEPOINT sp_prc_work;
        INSERT  …;
        INSERT  …;
        …
END;

Als een van beide invoegtoepassingen mislukt, worden alle wijzigingen die door de procedure zijn aangebracht ongedaan gemaakt en wordt deze afgesloten.



  1. Is het vreemd dat mijn SQLAlchemy MySQL-verbinding altijd slaapt?

  2. Hoe werkt Subquery in select-instructie in Oracle?

  3. mySQL Trigger werkt na het invoegen van de console, maar niet na het invoegen van het script

  4. Maak verbinding met MySql db via SSH in Netbeans