Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- if OBJECT_ID('dbo.cardholders') is not null
- drop table dbo.cardholders
- go
- create table dbo.cardholders (
- id int,
- name varchar(35),
- cardtype varchar(35),
- balance int
- --uncomment PK for SERIALIZABLE
- ,PRIMARY KEY (id)
- );
- go
- insert into dbo.cardholders values
- (1, 'George', 'Visa', 1000),
- (2, 'Steve', 'Mastercard', 1337),
- (3, 'Samwise', 'American Express', 1500)
- go
- --============================================================
- --READ UNCOMMITED
- --Черновое чтение (Dirty read)
- --читатели могт считывать данные незваршенной транзакции
- --процесса-писателя
- --============================================================
- begin transaction
- select * from dbo.cardholders
- update dbo.cardholders
- set balance = 90
- where id = 1
- waitfor delay '00:00:05'
- select * from dbo.cardholders
- commit
- --============================================================
- --READ COMMITED
- --Подтвержденное чтение
- --читатели не могут считывать данные незавершенной транзакции,
- --но писатели могут изменять уже прочитанные данные.
- --Если таблица захвачена, то прочитать данные
- --можно только после коммита
- --============================================================
- /*
- begin transaction
- select * from dbo.cardholders
- waitfor delay '00:00:05'
- --immidiate result on reader cuz table is not locked
- --only update/delete locks table
- update dbo.cardholders
- set balance = 90
- where id = 1
- select * from dbo.cardholders
- commit
- */
- --============================================================
- --REPEATABLE READ
- --Повторяемое чтение
- --повторное чтение данных вернет те же значения,
- --что были и в начале транзакции.
- --При этом писатели могут вставлять новые записи,
- --имеющие статус фантома при незавершенной транзакции.
- --============================================================
- /*
- set transaction isolation level
- repeatable read
- begin transaction
- select * from dbo.cardholders where id in (1, 2)
- waitfor delay '00:00:05'
- select * from dbo.cardholders where id in (1, 2)
- --insert is allowed
- --modifications that affect data selected in t. are not allowed
- --if data (row) is not locked then it can be modified
- rollback
- select * from dbo.cardholders
- */
- --============================================================
- --SERIALIZABLE
- --Сериализуемость
- --максимальный уровень изоляции,
- --гарантирует неизменяемость данных другими процессами
- --до завершения транзакции.
- --============================================================
- /*
- --add PRIMARY KEY
- set transaction isolation level
- serializable
- begin transaction
- select * from dbo.cardholders where id in (1,2)
- waitfor delay '00:00:05'
- select * from dbo.cardholders where id in (1,2)
- --only rows in range 1..3 of PRIMARY KEY will be locked
- --entire table can be modified
- rollback
- select * from dbo.cardholders
- */
- --============================================================
- --SNAPSHOT
- --Моментальный срез
- --читатели не ждут завершения транзакций писателей,
- --а считывают данные, точнее их версию,
- --по состоянию на момент начала своей транзакции.
- --============================================================
- /*
- set transaction isolation level
- snapshot
- begin transaction
- select * from dbo.cardholders
- waitfor delay '00:00:05'
- select * from dbo.cardholders
- --snapshot doesnt hold lock on table
- --so it can be reached in other sessions
- rollback
- select * from dbo.cardholders
- */
- //PARALLEL QUERY:
- --READ UNCOMMITED
- set transaction isolation level
- read uncommitted
- select * from dbo.cardholders
- /*
- --READ COMMITED
- set transaction isolation level
- read committed
- select * from dbo.cardholders
- */
- /*
- --REPEATABLE READ
- update dbo.cardholders set balance = 90 where id = 3
- insert into dbo.cardholders values (9, 'John', 'Visa', 0)
- */
- /*
- --SERIALIZABLE
- update dbo.cardholders set balance = 90 where id = 3
- */
- /*
- --SNAPSHOT
- update dbo.cardholders set balance = 90 where id = 3
- insert into dbo.cardholders values (9, 'John', 'Visa', 0)
- select * from dbo.cardholders
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement