Kas PostgreSQLis peaks vaate alampäringus kasutama SELECT ... FOR UPDATE?

Postitas Erki Eessaar 12.12.2022 10:37
Ei! Tõsi on see, et PostgreSQLis saab erinevalt Oraclest (12.1) vaate alampäringus kasutada SELECT ... FOR UPDATE. Siin kirjutatakse sellest pikemalt koos viitega laiendusel pgrowlocks, mis võimaldab hästi jälgida ridadele pandud lukke.

CREATE OR REPLACE VIEW Emp_all AS
SELECT *
FROM Emp INNER JOIN Dept USING (deptno) FOR UPDATE;

Kui nüüd keegi käivitab laused:

START TRANSACTION;
SELECT * FROM Emp_all;

, siis lukustatakse selle sessiooni jaoks eksklusiivselt kõik read tabelites Emp ja Dept. Teiste sõnadega, teistes sessioonides ei saa tabelites Emp ja Dept andmeid muuta, kuni selles sessioonis pole see transaktsioon lõppenud. See takistaks liiga palju andmebaasi samaaegset kasutamist erinevate kasutajate poolt ja pole seega soovitav. Seega SELECT .. FOR UPDATE vaates kasutama ei peaks.

SELECT ... FOR UPDATE tuleks näiteks kasutada rutiinides (nii eraldiseisvad kui trigeritega seotud) olevates kontrollpäringutes või andmemuudatuse lausete andmete kontrollimiseks mõeldud alampäringutes. Kui muudan andmeid tabelis A ja pean selleks kontrollima andmeid tabelist B, kuid samal ajal soovib keegi teine tabelis B neid samu kontrollimise aluseks olevaid andmeid muuta, siis tegemist on konfliktsete operatsioonidega, mis peaksid toimuma järjekorras, mitte samaaegselt. SELECT ... FOR UPDATE aitab seda saavutada.

Hinda postitust:

Keskmine hinne : Pole veel hinnanguid!