sql >> Databáze >  >> RDS >> Oracle

Mechanismus vkládání databáze

Ve výchozím nastavení Oracle používá úroveň řádku zámky.

Tyto zámky jsou blokovány pouze pro zapisovače (aktualizace, mazání, vkládání atd.). To znamená, že select bude fungovat po celou dobu, kdy je tabulka intenzivně aktualizována, mazána z atd.

Nechť je například tabulkaA(číslo sloupce1, číslo sloupce2) s těmito daty:

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

Pokud uživatel John vydá v time1 :

update tableA set col2=11 where col1=1;

uzamkne řádek1.

V time2 uživatel Označte vydání

update tableA set col2=22 where col1=2;

aktualizace bude fungovat, protože řádek 2 není uzamčen.

Nyní tabulka vypadá v databázi:

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

Pro Mark table is(nevidí změny jako nepotvrzené)

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

Pro John je tabulka:(nevidí změny jako nepotvrzené)

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

Pokud se značka pokusí v time3 :

update tableA set col2=12 where col1=1;

jeho relace bude pozastavena do time4 kdy John vydá commit .(Vrácením zpět se také odemknou řádky, ale změny budou ztraceny)

tabulka je (v db, v čase4):

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

Ihned po Johnově odevzdání se řádek 1 odemkne a aktualizace Marks udělá svou práci:

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

označme vydání rollbak v čase 5:

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

Vkládací případ je jednodušší, protože vložené řádky jsou zamčené, ale také je nevidí ostatní uživatelé, protože nejsou potvrzeny. Když se uživatel zaváže, uvolní také zámky, takže ostatní uživatelé mohou tyto řádky prohlížet, aktualizovat je nebo je smazat.

UPRAVIT :Jak vysvětlil Jeffrey Kemp, když máte PK (je implementován v Oracle s jedinečným indexem), pokud se uživatelé pokusí vložit stejnou hodnotu (takže bychom měli duplikát), uzamčení proběhne v index . Druhá relace bude zablokována, dokud neskončí první relace, protože se pokusí zapisovat na stejné místo. Pokud se první relace potvrdí, druhá vyvolá výjimku Porušení primárního klíče a nezmění databázi. Pokud se první relace vrátí zpět, druhá bude úspěšná (pokud se neobjeví žádný jiný problém).

(Poznámka:V tomto vysvětlení uživatele John mám na mysli relaci zahájenou uživatelem Johnem.)



  1. Zobrazuje se chyba při pokusu o vyplnění rozevíracího seznamu HTML daty Mysql v Javě?

  2. Jak získat počet aktuálního měsíce neděle v psql?

  3. Podívejte se, co sp_execute dělá

  4. Play 2.4 - Slick 3.0.0 - DELETE nefunguje