Oracle SQL: rad låsing på select statement

målet med dette innlegget er å forklare hvordan du låser en post på En Oracle Database, ved hjelp av en select statement.

Introduksjon

målet med dette innlegget er å forklare hvordan du låser en post i En Oracle-Database ved hjelp av en select-setning. Dette gjør at vi kan låse en plate uten å måtte endre den.

selv om dette kanskje ikke virker som et veldig vanlig brukstilfelle, er sannheten at vi kanskje trenger det for mer komplekse programmer (implementert for eksempel I PL/SQL), der vi trenger å gjøre noen komplekse valideringer før vi bestemmer oss for å oppdatere et bestemt register, og vi må opprettholde det låst under disse valideringene, slik at ingen annen transaksjon samtidig kan endre den.

VI skal bruke SQL Developer å samhandle med databasen og å utføre spørringer for denne opplæringen.

Låser den samme posten

som vanlig begynner vi med å lage et enkelt dummy-bord for å holde dataene våre. Sjekk opprett eksempel nedenfor.

create table Worker(WorkerID varchar(20),WorkerName varchar(255),WorkerJob varchar(255),CONSTRAINT PK_Worker PRIMARY KEY (WorkerID));

Etter det vil vi sette inn noen dummy-poster, så vi har data å jobbe med. Vi vil sette inn tre poster og deretter forplikte transaksjonen. Du kan bruke commit-knappen PÅ SQL Developer-menyen eller eksplisitt forplikte transaksjonen med EN SQL-setning.

insert into worker values ('1','John', 'nurse');insert into worker values ('2','Grace', 'farmer');insert into worker values ('3','Smith', 'doctor');

nå åpner Vi et nytt udelt regneark, slik at VI kan teste SQL-setningene i uavhengige transaksjoner. Sjekk figur 1 om hvordan du gjør det. Du kan lese mer om SQL Developer unshared regneark i dette forrige innlegget.

 sql Developer unshared regneark

Figur 1-Åpne et nytt unshared regneark.

nå er det første vi skal gjøre, å utføre et vanlig utvalg i begge regnearkene. Vi vil gjøre et valg for å få posten der WorkerID er lik 1. Ikke gjør noen forpliktelser eller rollbacks, bare utfør samme spørring i begge regnearkene.

select * from worker where WorkerID = 1;

som forventet er det ikke noe problem med samstemmighet, og vi vil motta posten i begge transaksjonene(Med Arbeidernavnet lik «John»).

nå går Vi tilbake til det første regnearket (det samme der vi opprettet tabellen) og legger til en «for update» – klausul i slutten av select-setningen, som angitt nedenfor. Igjen, ikke gjør noen commit eller rollback.

select * from worker where WorkerID = 1 for update;

når vi gjør dette, låser vi postene til resultatsettet uten behov for å oppdatere dem . Med andre ord, vi er eksplisitt låse postene. Selvfølgelig at når vi har dem låst, kan vi oppdatere dem hvis vi vil. Låsene på postene blir utgitt når vi gjør neste commit eller rollback .

Så, for å teste om låsene fungerer, går vi nå til det andre regnearket (det udelte regnearket vi åpnet). Der, hvis vi gjør et vanlig valg, uten» for oppdatering setning», vil vi få posten uten problem.

select * from worker where WorkerID = 1;

Men så, hvis vi gjentar select, nå med «for update» – setningen til slutt, vil den henge, siden annen transaksjon har posten Med WorkerID lik 1 låst, og vi prøver å låse den igjen.

select * from worker where WorkerID = 1 for update;

for å låse opp det, bare gå tilbake til det første regnearket og forplikte eller rulle tilbake transaksjonen. Nå, gå tilbake til det udelte regnearket, OG SQL-setningen skal ha utført, og returnere ønsket post.

Låsing av forskjellige poster

en viktig ting å huske på er at bare postene som er en del av resultatsettet, er låst av transaksjonen. Så, ulike transaksjoner kan gjøre «velg for oppdatering» i forskjellige poster.

for å teste dette, gå til det første regnearket og velg både post 1 og 3, med følgende select-setning:

select * from worker where WorkerID = 1 or WorkerID = 3 for update;

gå Nå Til det udelte regnearket og prøv å låse rekord 2.

select * from worker where WorkerID = 2 for update;

det skal fungere og returnere et resultat, siden posten Med WorkerID lik 2 ikke ble låst av den første transaksjonen. Nå, hvis vi i samme udelte regneark prøver å låse posten Med Worker ID lik 1 eller posten Med Worker ID lik 3 (eller begge), vil den henge til vi forplikter eller ruller tilbake transaksjonen fra det første regnearket.

Relatert innhold

  • Oracle Velg for oppdatering statment

Write a Comment

Din e-postadresse vil ikke bli publisert.