Oracle a zamky(Re: Multiuzivatelsky SQL server)

Honza Pazdziora adelton na informatics.muni.cz
Čtvrtek Říjen 7 11:23:11 CEST 1999


> rollbackem nebo commitem. Ad INSERT: az do skonceni transakce ten zaznam
> stejne nikdo nevidi a tudiz ani k nemu menuze pristupovat (ACID vlastnosti
> transakci).

To je pravda, ale ten insert Vam muze zamknout druhou tranaskaci,
napriklad na constraintu (tohle jsem mel na mysli, kdyz jsem falesne
obvinil Oracle, ze nezamyka po blocich).

> Dale. Opravdu se v Oraclu defaultne nezamyka cela tabulka.

Ano, moje chyba (viz nize).

> A jeste jedna vec. Teoreticky muzete zamykat na nekolika urovnich - cela
> tabulka, blok s vice zaznamy, konkretni zaznamy. Dokonce to muzete napsat
> tak, aby se rozhodovani provadelo automaticky. Cim mensi kus zamknete tim
> mensi nebezpeci deadlocku anebo nutnost cekani na uvolneni neceho vam hrozi,
> je to ovsem pracnejsi takze horsi vykon.

Co kdyz pustim dlouhy update -- na nekolika stech tisicich zaznamu.
A pustim druhy v jine session. Musim nejak zjistit, ktere zaznamy
budou ovlivneny a ty zamnkout. Nez to zjistim, domnivam se, ze se na
te tabulce musim zeserializovat (tedy zamknout celou tabulku), protoze
jinak se mi muze stat, ze pulku zaznamu zamknu jednim updatem a pulku
druhym a dosahnu bud deadlocku nebo nekonzistence nebo neceho
takoveho. Pote, co uz je update proveden, si drzim informaci
o zmodifikovanych ale necommitnutych datech primo u tech dat, takze
nikdo jiny na ne neprijde. Ale nez to nastane (nez vyhodnotim, koho
budu vlastne menit), jdu po cele tabulce, ne?

Navic zamky na urovni bloku maji jeste jeden problem. Predstavme si

session 1:				session 2:

update table set neco = ? where id = 1
					update table set neco = ? where id = 2

update table set neco = ? where id = 2 /* vysledek je cekani na zamek */
					update table set neco = ? where id = 2
				/* vysledek je deadlock a spadena transakce
				v session 1 (alespon v Oraclu) */

Tohle Vam u MySQL nenastane protoze po provedeni kazdeho prikazu je
"transakce" commitnuta. Cili bylo by tam na neco zamykani po
zaznamech? Kdyz by to byl zamek pouze na dobu provedeni toho SQL
prikazu (ktera ano, muze byt dlouha), nikoli na dobu mezi SQL
prikazy?

------------------------------------------------------------------------
 Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
 .project: Perl, DBI, Oracle, MySQL, auth. WWW servers, MTB, Spain, ...
------------------------------------------------------------------------


Další informace o konferenci Databases