sql >> Database >  >> RDS >> PostgreSQL

Moet ik SELECT's in een transactie opnemen?

De korte versie:"Het hangt ervan af".

De lange versie:

Als je een lees-wijzig-schrijfcyclus uitvoert, dan moet het niet alleen een transactie zijn, maar moet je ook SELECT ... FOR UPDATE alle records die u later wilt wijzigen. Anders loop je het risico verloren schrijfacties te verliezen, waarbij je een update overschrijft die iemand anders heeft gemaakt tussen het moment waarop je het record hebt gelezen en het moment waarop je de update schreef.

SERIALIZABLE transactie-isolatie kan hierbij ook helpen.

Je moet echt gelijktijdigheid en isolatie begrijpen. Helaas is het enige simpele "doe gewoon X"-antwoord zonder het te begrijpen, om elke transactie te beginnen door alle betrokken tafels te vergrendelen. De meeste mensen willen dat niet.

Ik raad aan om de tx isolatiedocumenten . Experimenteer met gelijktijdige psql sessies (meerdere terminals) om race-omstandigheden en conflicten te creëren.



  1. Hoe een enorme tabelgegevens naar een andere tabel in SQL Server te kopiëren?

  2. (Postgresql) maak de tabeltriggerfunctie voeg de ID-waarde van de gewijzigde rij in de logtabel in, voor aangepaste replicatie

  3. Omgaan met PHP-server en MySQL-server in verschillende tijdzones

  4. Waarom werkt dit voorbeeld van selecteren voor update?