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:
Ovi entiteti se dele na:
SQL za zaključavanje na različitim nivoima granularnosti podržava slične tipove brava za različite situacije:
Zaključavanjem može se upravljati pomoću:
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:
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:
Svaka transakcija u SQL Server-u dovodi do modifikovanja podataka, prilikom izvršavanja naredbe u potpunosti ili ne izvršavanja. Vrste transakcije su:
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
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
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.