Postgres pro standard de documentare 9

LOCK TABLE primește o blocare la nivelul mesei, dacă este necesar, așteptând eliberarea tabelului de la alte încuietori conflictuale. Dacă este specificat NOWAIT. LOCK TABLE nu așteaptă să se elibereze tabelul: dacă blocarea nu poate fi recepționată imediat, comanda este întreruptă și se emite o eroare. Odată ce blocarea este recepționată, aceasta este menținută până când tranzacția curentă este finalizată. (Comanda UNLOCK TABLE nu există, blocările sunt întotdeauna lansate la sfârșitul tranzacției.)







Prin solicitarea blocărilor automate pentru comenzile care funcționează cu mesele, Postgres Pro alege întotdeauna cel mai puțin restrictiv mod de blocare posibil. Tabelul LOCK TABLE este destinat cazurilor în care este necesară o blocare mai puternică. De exemplu, să presupunem că o aplicație efectuează o tranzacție la nivelul de izolare READ COMMITTED și trebuie să primească date neschimbate în întreaga tranzacție. Pentru a realiza acest lucru, puteți obține o blocare în modul SHARE pentru masă. înainte să o cheme. Modificările rezultate paralele de date sunt eliminate și citirile ulterioare vor obține o reprezentare stabilă a datelor înregistrate, ca și conflictele de mod de blocare a COTA cu blocarea ROW EXCLUSIV. Numele tabelului LOCK IN SHARE MODE va ​​aștepta până când tranzacțiile paralele cu blocarea ROW EXCLUSIVE vor fi angajate sau anulate. Astfel, în momentul primirii unei astfel de blocări, nu va exista nici o operație de scriere deschisă deblocată; În plus, nimeni nu poate scrie la masă până când nu este înlăturată.

Dacă într-o tranzacție de acest fel doriți să modificați datele într-un tabel, trebuie să utilizați modul de blocare SHARE ROW EXCLUSIVE în loc de SHARE pentru acesta. Acest mod asigură că numai o singură tranzacție de acest tip va fi executată la un moment dat. Fără această restricție este posibilă blocarea: două tranzacții pot primi în același timp încuietori SHARE. după care nu pot obține blocarea ROW EXCLUSIVE. să implementeze efectiv modificările. (Rețineți că propria tranzacție blocare niciodată un conflict, astfel încât o tranzacție poate dobândi o ROW de blocare EXCLUSIV ea deține blocare SHARE -. Dar nu atunci când blocarea acțiuni deținute de o altă tranzacție.) Pentru a evita blocajele, asigurați-vă că blochează toate tranzacțiile se solicită un obiect în aceeași ordine și dacă pentru un obiect se solicită interblocări în diferite moduri, tranzacțiile ar trebui să solicite întotdeauna cea mai strictă blocare.







Pentru mai multe informații despre modurile și strategiile de blocare, consultați secțiunea 13.3.

Numele (eventual completat de o schemă) a unui tabel existent pentru care este solicitată o blocare. Dacă numele mesei este specificat DOAR. numai tabelul specificat este blocat. Fără NUMAI, tabela specificată este blocată și toți descendenții ei (dacă există). După numele tabelului, puteți adăuga și un * opțional. pentru a indica explicit că blocarea afectează toate tabelele copilului.

Comanda LOCK TABLE a, b; este echivalent cu secventa LOCK TABLE a; TABEL DE ÎNCĂRCARE b; Tabelele sunt blocate unul câte unul în ordinea specificată în comanda LOCK TABLE. blocare

Modul de blocare determină ce blocare va fi confruntată cu aceasta. Modurile de blocare sunt descrise în secțiunea 13.3.

Dacă modul de blocare nu este specificat, se aplică modul cel mai stricte, ACCES EXCLUSIVE. nowait

Indică faptul că LOCK TABLE nu trebuie să aștepte eliberarea blocărilor conflictuale: dacă blocarea solicitată nu poate fi obținută imediat, tranzacția este întreruptă.

TABELUL DE ÎNCĂRCARE. În MOD ACCESS ACCESS este necesară permisiunea SELECT în tabela destinație. TABELUL DE ÎNCĂRCARE. MODUL EXCLUSIV IN ROW necesită drepturi INSERT. UPDATE. DELETE sau TRUNCATE pentru tabela destinație. Toate celelalte forme de LOCK necesită UPDATE. DELETE sau TRUNCATE la nivelul mesei.

În afara blocului de tranzacții, comanda LOCK TABLE este inutilă: blocarea va fi reținută numai până când tranzacția va fi finalizată. Prin urmare, Postgres Pro generează o eroare atunci când încearcă să aplice LOCK nu în blocul de tranzacții. Pentru a determina blocul de tranzacții, utilizați BEGIN și COMMIT (sau ROLLBACK).

LOCK TABLE poate seta numai încuietori la nivelul mesei, astfel încât toate denumirile de mod care includ cuvântul ROW (șir) nu sunt complet corecte. Ar trebui să le tratezi astfel încât în ​​aceste moduri utilizatorul intenționează să primească în tabelul de blocare la nivelul rândului blocat. Rețineți, de asemenea, că în modul ROW EXCLUSIVE este setată o blocare de masă partajată. Rețineți că, cu LOCK TABLE, toate modurile de blocare funcționează în același mod, numai regulile care determină modul în care se confruntă sunt diferite. Pentru a afla cum să obțineți o blocare la nivelul rândului, consultați Subsecțiunea 13.3.2 și Blocarea în Ajutorul SELECT.

Obținerea blocării SHARE pentru cheia primară a tabelului la adăugarea unei intrări în tabelul copil:

Setarea blocării SHARE ROW EXCLUSIVE în tabelul cu chei primare înainte de efectuarea operației de ștergere:

compatibilitate

Comanda LOCK TABLE nu este în standardul SQL, în care nivelurile de izolare a tranzacțiilor sunt definite de comanda SET TRANSACTION. Postgres Pro sprijină, de asemenea, această opțiune; Acest lucru este descris mai detaliat în SET TRANSACTION.

Cu excepția ACCESS SHARE. ACCES EXCLUSIVE și SHARE UPDATE EXCLUSIVE. modurile de blocare din Postgres Pro și sintaxa LOCK TABLE sunt compatibile cu cele din SGBD Oracle.







Trimiteți-le prietenilor: