sql >> Database teknologi >  >> RDS >> Oracle

Databaseindsættelsesmekanisme

Som standard bruger Oracle rækkeniveau låse.

Disse låse blokerer kun for forfattere (opdater, slet, indsæt osv.). Det betyder, at valg vil virke hele tiden, når en tabel er tung opdateret, slette fra osv.

Lad f.eks. være tabelA(col1-nummer, col2-nummer), med disse data indeni:

col1 | col2 1 | 10 2 | 20 3 | 30

Hvis brugeren John har problemer på time1 :

update tableA set col2=11 where col1=1;
 

vil låse række1.

time2 bruger Marker udstede en

update tableA set col2=22 where col1=2;
 

opdateringen vil virke, fordi række 2 ikke er låst.

Nu ser tabellen i databasen:

col1 | col2 1 | 11 --locked by john 2 | 22 --locked by mark 3 | 30

For Mark-tabellen er(han ser ikke ændringerne uforpligtet)

col1 | col2 1 | 10 2 | 22 3 | 30

For John er tabellen:(han kan ikke se ændringerne uforpligtet)

col1 | col2 1 | 11 2 | 20 3 | 30

Hvis mark prøver på time3 :

update tableA set col2=12 where col1=1;
 

hans session vil hænge indtil time4 når John vil udstede en commit .(Rollback vil også låse rækkerne op, men ændringer vil gå tabt)

tabellen er (i db, på tidspunkt 4):

col1 | col2 1 | 11 2 | 22 --locked by mark 3 | 30

Umiddelbart, efter Johns commit, låses række1 op, og Marks' opdatering vil gøre jobbet:

col1 | col2 1 | 12 --locked by mark 2 | 22 --locked by mark 3 | 30

lad os markere udstede en rollbak på time5:

col1 | col2 1 | 11 2 | 20 3 | 30

Indstiksboksen er enklere, fordi indsatte rækker er låst, men heller ikke ses af andre brugere, fordi de ikke er commited. Når brugeren forpligter sig, frigiver han også låsene, så andre brugere kan se disse rækker, opdatere dem eller slette dem.

REDIGER :Som Jeffrey Kemp forklarede, når du har PK (det er implementeret i Oracle med et unikt indeks), hvis brugerne forsøger at indsætte den samme værdi (så vi ville have en duplikat), vil låsningen ske i indeks . Den anden session vil blive blokeret, indtil den første session slutter, fordi den forsøger at skrive samme sted. Hvis den første session commits, vil den anden give Primær nøgle overtrådt undtagelse og vil ikke ændre databasen. Hvis den første session udfører en tilbagerulning, vil den anden lykkes (hvis der ikke dukker noget andet problem op).

(NB:I denne forklaring af bruger John mener jeg en session startet af bruger John.)



  1. PHP MySQL indsættelse virker ikke

  2. LEAST() Funktion i Oracle

  3. Er der en måde at bryde ind i en PostgreSQL-database, hvis du har glemt adgangskoden?

  4. autofuldførelse viser alle poster, søger ikke