t-sql: Table lock en Transaction

Voor een update script van een datawarehouse wilde ik van twee dingen zeker zijn:

  1. Als het script mislukt, dan mogen er geen wijzigingen in de database zijn
  2. 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
This entry was posted in sql and tagged , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>