Oracle SQL: rivin lukitus select statement

tämän viestin tavoitteena on selittää, miten lukita tietue Oraclen tietokantaan select statement-lausekkeen avulla.

Johdanto

tämän postauksen tavoitteena on selittää, miten tietue lukitaan Oraclen tietokantaan select statement-lausekkeen avulla. Näin voimme lukita tietueen ilman tarvetta muuttaa sitä.

vaikka tämä ei ehkä vaikuta kovin yleiseltä käyttötapaukselta, totuus on, että saatamme tarvita sitä monimutkaisemmissa ohjelmissa (esimerkiksi PL/SQL: ssä), joissa meidän on tehtävä joitakin monimutkaisia validointeja ennen kuin päätämme päivittää tietyn rekisterin, ja meidän on pidettävä se lukittuna näiden validointien aikana, joten mikään muu tapahtuma ei voi samanaikaisesti muuttaa sitä.

käytämme SQL Developeria vuorovaikutuksessa tietokannan kanssa ja suorittamaan kyselyt tätä opetusohjelmaa varten.

lukitsemalla saman tietueen

kuten tavallista, aloitamme luomalla yksinkertaisen valetaulukon, johon tallennamme tietomme. Tarkista luo esimerkki karjua.

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

sen jälkeen lisätään valetiedot, joten meillä on dataa työstettävänä. Lisäämme kolme tietuetta ja toimitamme kaupan. Voit käyttää toimitus-painiketta SQL Developer-valikossa tai toimittaa tapahtuman nimenomaisesti SQL-lausekkeella.

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

nyt avaamme uuden korottamattoman laskentataulukon, jotta voimme testata SQL-lausekkeita itsenäisissä tapahtumissa. Tarkista kuva 1, Miten se tehdään. Voit lukea lisää SQL Developer unshared laskentataulukoita tässä edellisessä viestissä.

SQL Developer unshared worksheet

Kuva 1-avataan uusi Koruton laskentataulukko.

nyt ensimmäinen asia, jonka aiomme tehdä, on säännöllisen valinnan suorittaminen molemmissa työarkeissa. Teemme valita saada kirjaa, jossa WorkerID on yhtä kuin 1. Älä tee toimituksia tai palautuksia, suorita sama kysely molemmissa laskentataulukoissa.

select * from worker where WorkerID = 1;

odotetusti yksimielisyyden kanssa ei ole ongelmia ja saamme ennätyksen molemmissa tapahtumissa (työnimellä ”John”).

nyt palaamme ensimmäiseen laskentataulukkoon (samaan, jossa loimme taulukon) ja lisäämme ”päivitettäväksi” – lausekkeen select statement-lausekkeen loppuun, kuten on ilmoitettu karjua. Jälleen, älä tee mitään sitoutumista tai rollback.

select * from worker where WorkerID = 1 for update;

tätä tehdessämme lukitsemme tulosjoukon ennätykset ilman, että niitä tarvitsee päivittää . Toisin sanoen me nimenomaan lukitsemme tiedot. Tietenkin, että kun ne on lukittu, voimme päivittää niitä, jos haluamme. Levyjen lukot julkaistaan, kun teemme seuraavan toimituksen tai palautuksen .

joten testataksemme, toimivatko lukot, menemme nyt toiseen laskentataulukkoon (avaamaamme avoimeen laskentataulukkoon). Siellä, jos teemme säännöllisesti valita, ilman ”for update lause”, saamme ennätys ilman ongelmia.

select * from worker where WorkerID = 1;

mutta sitten, jos toistamme select-lauseen, nyt lopussa on ”päivitettäväksi” – lause, se roikkuu, koska muu tapahtuma on tietueen kanssa WorkerID yhtä suuri kuin 1 lukittu, ja yritämme lukita sen uudelleen.

select * from worker where WorkerID = 1 for update;

avataksesi sen, palaa ensimmäiseen laskentataulukkoon ja toimita tai Peruuta tapahtuma. Nyt, palaa unshared laskentataulukko ja SQL selvitys olisi pitänyt suorittaa, palauttamalla haluttu ennätys.

eri tietueiden lukitseminen

yksi tärkeä asia pitää mielessä, että vain tulosjoukkoon kuuluvat tietueet lukitaan tapahtumalla. Niin, eri liiketoimet voivat tehdä ”Valitse päivitettäväksi” eri tietueissa.

jos haluat testata tätä, siirry ensimmäiseen laskentataulukkoon ja valitse sekä tietue 1 että 3, jossa on seuraava virke:

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

nyt mene unshared laskentataulukko ja yrittää lukita ennätys 2.

select * from worker where WorkerID = 2 for update;

sen pitäisi toimia ja palauttaa tulos, koska tietuetta, jossa WorkerID on 2, ei lukittu ensimmäisellä tapahtumalla. Nyt, jos samassa jakamattomassa laskentataulukossa yritämme lukita tietueen työntekijän tunnuksella, joka on 1 tai tietueen työntekijän tunnuksella, joka on 3 (tai molemmat), se roikkuu, kunnes toimitamme tai palautamme tapahtuman ensimmäisestä laskentataulukosta.

aiheeseen liittyvä sisältö

  • Oracle Select for update statment

Write a Comment

Sähköpostiosoitettasi ei julkaista.