Voor een update script van een datawarehouse wilde ik van twee dingen zeker zijn:
- Als het script mislukt, dan mogen er geen wijzigingen in de database zijn
- Als de update bezig is, mag er geen data worden uitgelezen in rapporten om er zeker van te zijn dat het rapport juiste data laat zien
Je kunt hiervoor het Transaction statement gebruiken in t-sql. Om er zeker van te zijn dat tijdens het uitvoeren van deze code er geen gegevens uit de tabel gelezen kunnen worden heb ik een kleine test gemaakt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | -- creëer tabel CREATE TABLE TransActionTest (nummer INT) GO ; -- voeg de waarde 1 toe aan tabel INSERT INTO TransActionTest (nummer) VALUES(1) GO ; -- begin transactie BEGIN TRAN BEGIN TRY INSERT INTO TransActionTest (nummer) VALUES (2) WAITFOR DELAY '00:01' -- wacht 1 minuut (00:00:01 is 1 seconde) COMMIT TRANSACTION -- commit de transactie en voeg de waarde toe aan de tabel END TRY BEGIN CATCH ROLLBACK TRANSACTION -- rollback de transactie als er een error optreedt END CATCH -- deze query in een apart venster aanroepen -- binnen 1 minuut van bovenstaande query SELECT nummer FROM TransActionTest |
Wat gebeurd er in deze test:
- Er wordt een tabel gemaakt
- In de tabel wordt het getal 1 toegevoegd
- In een Transaction statement wordt waarde 2 toegevoegd aan de tabel, maar voordat dit wordt afgerond wordt er met een Waitfor statement 1 minuut gewacht
- Als je tijdens die minuut wat probeert te doen met de tabel wordt er gewacht tot de transactie is afgerond
