SQL Server je kolekcija deljivih resursa. Korisnici pristupaju istim resursima u istom trenutku. Korisnička baza je resurs koji korisnik može da zahteva, tada na bi trebalo da drugi korisnik izvršava akciju na nivou baze (uklanjanje i restauriranje). Baza sadrži tabele i u trenutku kada korisnik pristupa tabeli, on implicitno koristi i bazu.

Korisnik kada očitava jednu vrstu sa podacima koristeći stranicu na kojoj se nalaze podaci iz ove vrste. Svaka tabela sadrži stranicu, baza podatka sadrži tabelu. SQL Server upravlja zaključavanjem tih resursa koji se trenutno koriste i potencijalno zaključava sve druge neophodne objekte u hijerarhiji.

Objekti čiji se pristup može ograničavati su:

  • RID – Identifikator vrste koji se koristi za zaključavanje jedne vrste u hipu.
  • Key – Ključ vrste u indeksu.
  • Page – Stranica sa podacima ili indeksima, veličine 8KB koja se nalazi u bazi podataka.
  • Range – Skup resursa koji su zaključani kako bi se sprečili novi unosi.
  • Extent – Skup od osam uzastopnih stranica.
  • HoBT – Hip ili B-stablo, koje se koristi prilikom zaštite hip struktura podataka ili indeksnih struktura.
  • Tabele – Celokupna tabela koja sadrži stranice sa podacima ili indeksima.
  • File – Datoteka baze podataka koja se koristi prilikom alociranja fizičkog prostora u bazi podataka.
  • Alocation Unit – Definišu se stranice višeg nivoa, obično povezane sa skladištenjem podataka u vrsti ili velikih objekata (lob resursa).
  • Database – Celokupna baza podataka.

 

Ovi entiteti se dele na:

  • Fizičke strukture (zaključavaju se kada SQL Server modifikuje fizičku strukturu podataka ili alokaciju te strukture)
  • Logičke strukture (zaključavaju se zbog modifikovanja podataka)

 

SQL za zaključavanje na različitim nivoima granularnosti podržava slične tipove brava za različite situacije:

  • Deljive brave (realizuju operaciju čitanja, zaključavaju resurs dok traje operacija i niko nije u mogućnosti da promeni podatke)
  • Ekskluzivne brave (se realizuju dok traje operacija upisivanja)
  • Brave za ažuriranje (primenju se u situacijama u kojima operacija ažuriranja zahteva da se više puta pristupa podacima u cilju upravljanja procesima)
  • Intent brave (deluju kao marker koji definiše transakciju da su drugi resursi nižeg nivoa zaključani i drugo svaka brava definisana na nivou vrste može dovesti do zaključavanja na nivou stranice ili na nivou tabele)

 

Zaključavanjem može se upravljati pomoću:

  • Konfiguracije baze podataka (Opcija „Database Read-Only“ u Properties baze obezbeđuje samo mogućnost čitanja baze).
  • Preporuke za zaključavanje
    Sintaksa u telu za zaključavanje je WITH (Hint) koja definiše tip i funkcionalnost brave.

 

Primer:

Use AdventureWorks2008
SELECT * From Customer WITH (TABLOCK)
WHERE LastName LIKE 'Ca%'

 

Ovaj kod obezbeđuje zaključavanje na nivou tabele, umesto podrazumevanog zaključavanja na nivou vrste.

Podešavanja vezana za izolovanje transakcija:

  • Read Uncommitted nivo (omogućava da transakcija očitava resurse koje je neka transakcija modifikovala)
  • Read Commited nivo (onemogućava čitanje resursa kojima trenutno pristupa neka druga transakcija)
  • Rapeattable Read nivo (sprečava da se podaci modifikuju izvan neke druge transakcije)
  • Serializable nivo (transakcija je u potpunosti izolovana)

 

SQL Serever podržava i Snapshot izolovanje, modifikovanje podataka vezano za druge transakcije koje se izvršavaju nakon pokretanja tekuće transakcije i nije vidljivo naredbama koje se izvršavaju u tekućoj transakciji.

Primer:

Use AdventureWorks2008
 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITED;
 Go
 SELECt * FROM Customer;
 SELECT * FROM Product;
 GO

 

U okruženju sa više korisnika dolazi do situacije gde je moguć zastoj u sistemu. To se rešava:

  • Pažljivim kreiranjem koda kako bi se svim resursima uvek pristupilo na određeni način. Tada jedan korisnik ne dovodi do zastoja jer ne zaključava resurs van definisanog redosleda.
  • Definisanje prioriteta konekcije, sve konekcije koje imaju nizak priorite se uklanjaju sličnom naredbom: SET DEADLOCK_PRIORITY LOW.

 

SQL Server transakcije

Svaka transakcija u SQL Server-u dovodi do modifikovanja podataka,  prilikom izvršavanja naredbe u potpunosti ili ne izvršavanja. Vrste transakcije su:

  • IMPLICITNA transakcija (INSERT, UPDATE i DELETE naredba) koja funkcioniše automatski.
  • EKSPLICITNA transakcija. To su transakcije koje zahtevaju da se definišu pomoću BEGIN TRANSACTION u TSQL kod ili koriščenjem poziva transakcionog API interfejsa iz klijentske aplikacije. Svaka eksplicitna transakcija počinje izvršavanjem neredbe BEGIN TRANSACTION u okviru SQL naredbe, SQL Server postavlja transakcioni marker u transakcioni log, radi oparavka. Naredba za izvršavanje transakcije je:

BEGIN TRANSACTION;
DELETE FROM table;
COMMIT TRANSACTION ili
ROLLBACK TRAN;

 

Postoji mogućnost ugnježdavanja imenovanih transakcija koja ne omogućava da se parcijalno potvrdi transakcija. Treba koristiti Save point marker koji predstavljaju tačke integriteta sa logikom:

ROLLBACK TRAN naziv_transakcije
COMMIT TRAN transakcija1

 

Transakcija i greške

Prilikom izvršavanja transakcije ne postoji mogučnost rukovanja greškama, ukoliko prva naredba bude neuspešno izvršena, SQL Server može jednostavno da nastavi sa izvršavanjem druge naredbe i može da je potvrdi, ako je uspešno izvršena. Da bi se to izbeglo, neophodno je napisati sličan kod:

BEGIN TRY
BEGIN TRAN;
DELETE FROM TABELE1;
DELETE FROM TABELE2;
COMMIT;
END TRY
BEGIN CATCH
    ROLLBACK TRAN;
END CATCH

 

Distribuirane transakcije

SQL Server ima alat DTC (Distributed Transaction Coordinator) koji održava integritet distribuiranih transakcija u SQL  okruženju. Distribuirana transakcija se deli na dve faze:

Pripremna faza zahteva da se svi servisi koji učestvuju u transakciji navedu zajedno sa svim zadacima koji su mu dodeljeni. DTC svakoj instanci dodeljuje poslove. Instanca izvršava posao transakcije, bez potvrde.

Faza potvrđivanja DTC očekuje od servisa obaveštenje za mogućnost potvrde o izvršavanju transakcije. Servisi šalju odgovor u vremenskom roku i mogućnost potvđivanja  izvršenog posla. U suprotnom, šalje se Abort poruka „transakcija se ne izvršava“.

 

Funkcija OpenRowset

OpenRowset() funkcija je primaran metod za izvršavanje upita na odredišnom serveru na ad hok bazi.

Sintaksa:

OPENROWSET
  (
{‘naziv_provajdera’,
{’izvor podataka’ ; ’id_korisnika’ ; ’SIFRA’|’string_provajdera’},
{[ katalog. ] [Šema. ]objekat | ‘upit’}}
)

 

Odredište servera se konfiguriše radi ad hok distribuiranih upita na odredišnom serveru sličnim kodom:

EXEC sp_configure ’Show Advanced Option’, 1;
RECONFIGURE;
EXEC sp_configure ’Ad Hoc Distributed Queries’, 1;
RECONFIGURE;
EXEC sp_configure ’Show Advanced Options’, 0;
RECONFIGURE;

 

Nakon obezbeđenja mogućnosti koriščenja distributivnog upita mogu se izvršavati upiti nad bazom sa distributivnog servera.

Primer:

select distinct FirstName, LastName
from SalesLT.Customer(
           SQLNCL’, sever= ins_servera_zaizvrsavanjaDTCTarget;
                    Database=AdventureWorks2008;
     Trusted_connection = yes’,
          ’select FirstName, LastName FROM SalesLT.Customer’
                      ) AS dtc
    WHERE dtc.LastName LIKE 'L%';

 

U primeru jedan upit se prosleđuje za izvršavanje na odredišnom serveru, drugi se koristi za filtriranje podataka na lokalnom serveru.

 

O konfigurisanju povezanih servera i o definisanju distribuiranih transakcija detaljnije možete videti u PDF fajlu.

Dodaj komentar Sviđa mi se - (1) Ne sviđa mi se - (0)    

  • Upravljanje transakcijama 1
  • Upravljanje transakcijama 2
  • Upravljanje transakcijama 3