sql >> Database >  >> RDS >> Oracle

Verschil tussen VOOR UPDATE VAN en VOOR UPDATE

Uit de Oracle-documentatie :

Als uw zoekopdracht naar een enkele tabel verwijst, is er geen verschil tussen FOR UPDATE en FOR UPDATE OF ... , maar de laatste kan nog steeds handig zijn als zelfdocumentatie om aan te geven welke kolommen u wilt bijwerken. Het beperkt echter niet wat u kunt bijwerken. Als je het volgende hebt:

CURSOR cur IS SELECT * FROM emp FOR UPDATE OF sal;

dan kun je nog steeds doen:

UPDATE emp SET comm = comm * 1.1 WHERE CURRENT OF cur;

Maar als er meer dan één tabel is, dan FOR UPDATE OF ... vergrendelt alleen de rijen in de tabellen die de kolommen bevatten die u opgeeft in de OF clausule.

In tegenstelling tot wat ik denk dat je in de vraag zegt. specificeren van FOR UPDATE OF sal vergrendelt niet alleen de sal kolom; u kunt nooit een enkele kolom vergrendelen, de minimale vergrendeling is op rijniveau. (Lees meer over sloten ). Het vergrendelt alle rijen in de tabel die de SAL . bevatten kolom, die worden geselecteerd door de zoekopdracht.

In de update van uw vraag voegt uw cursorquery zich bij emp en dept , maar de OF clausule heeft alleen sal , een kolom in de emp tafel. De rijen in de emp tabel wordt vergrendeld wanneer de cursor wordt geopend, en die vergrendelingen worden niet vrijgegeven totdat u commit of rollback die sessie. Binnen uw cursorlus kunt u het volgende doen:

UPDATE emp SET ... WHERE CURRENT OF emp_cur;

... om de rij in de emp . bij te werken tabel die betrekking heeft op deze iteratie van de lus. Je kan niet doen:

UPDATE dept SET ... WHERE CURRENT OF emp_cur;

... omdat rijen in de dept tabellen zijn niet vergrendeld, omdat er geen kolommen waren in de OF . Dat betekent ook dat in je tweede sessie de dept rijen kunnen vrij worden bijgewerkt, omdat ze niet zijn vergrendeld door de eerste sessie.



  1. Wat te doen (of niet te doen) over de beste wachtstatistieken

  2. syntaxisfout, onverwachte 'mysql_connect' (T_STRING)

  3. Inconsistent transponeren

  4. ingevoerde formuliergegevens worden niet opgeslagen in mysql db?