Ульяновский государственный университет
Опубликован: 10.09.2004 | Доступ: свободный | Студентов: 34479 / 4441 | Оценка: 4.06 / 3.65 | Длительность: 16:15:00
ISBN: 978-5-9556-0101-4
Лекция 16:

Транзакции и блокировки

< Лекция 15 || Лекция 16: 1234 || Лекция 17 >

Уровни изоляции SQL Server

Уровень изоляции определяет степень независимости транзакций друг от друга. Наивысшим уровнем изоляции является сериализуемость, обеспечивающая полную независимость транзакций друг от друга. Каждый последующий уровень соответствует требованиям всех предыдущих и обеспечивает дополнительную защиту транзакций .

SQL Server поддерживает все четыре уровня изоляции, определенные стандартом ANSI. Уровень изоляции устанавливается командой:

SET TRANSACTION ISOLATION LEVEL
	{ READ UNCOMMITTED
	| READ COMMITTED 
	| REPEATABLE READ
	| SERIALIZABLE }
  • READ UNCOMMITEDнезавершенное чтение, или допустимо черновое чтение. Низший уровень изоляции, соответствующий уровню 0. Он гарантирует только физическую целостность данных: если несколько пользователей одновременно изменяют одну и ту же строку, то в окончательном варианте строка будет иметь значение, определенное пользователем, последним изменившим запись. По сути, для транзакции не устанавливается никакой блокировки, которая гарантировала бы целостность данных. Для установки этого уровня используется команда:
    SET TRANSACTION ISOLATION
    LEVEL READ UNCOMMITTED
  • READ COMMITTEDзавершенное чтение, при котором отсутствует черновое, "грязное" чтение. Тем не менее в процессе работы одной транзакции другая может быть успешно завершена и сделанные ею изменения зафиксированы. В итоге первая транзакция будет работать с другим набором данных. Это проблема неповторяемого чтения . Данный уровень изоляции установлен в SQL Server по умолчанию и устанавливается посредством команды:
    SET TRANSACTION ISOLATION
    LEVEL READ COMMITTED
  • REPEATABLE READповторяющееся чтение. Повторное чтение строки возвратит первоначально считанные данные, несмотря на любые обновления, произведенные другими пользователями до завершения транзакции. Тем не менее на этом уровне изоляции возможно возникновение фантомов . Его установка реализуется командой:
    SET TRANSACTION ISOLATION
    LEVEL REPEATABLE READ
  • SERIALIZABLEсериализуемость. Чтение запрещено до завершения транзакции. Это максимальный уровень изоляции, который обеспечивает полную изоляцию транзакций друг от друга. Он устанавливается командой:
    SET TRANSACTION ISOLATION
    LEVEL SERIALIZABLE

В каждый момент времени возможен только один уровень изоляции.

Таблица 16.1. Уровень изоляции конкурирующей транзакции принят по умолчанию (READ COMMITTED). В примере шаги 4, 6 и 8 демонстрируют черновое чтение. Шаги 9 и 10 блокируются, потому что данные захвачены конкурирующей транзакцией.
Пользователь user1 Конкурирующая транзакция Пользователь user2 Текущая транзакция
USE basa_user2

BEGIN TRANSACTION TRA

USE basa_user2

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

BEGIN TRANSACTION TRB

1. SELECT * FROM Товар 2. SELECT * FROM Товар
3. UPDATE Товар SET остаток=остаток+10 WHERE КодТовара=4 4. SELECT * FROM Товар (читает измененные неподтвержденные данные)
5. DELETE FROM Товар WHERE КодТовара=4 6. SELECT * FROM Товар (читает измененные неподтвержденные данные)
7. INSERT Товар (Название, остаток) VALUES ('SS',999) 8. SELECT * FROM Товар (читает измененные неподтвержденные данные)
12. ROLLBACK TRANSACTION TRA 9. UPDATE Товар SET остаток=остаток+10 WHERE КодТовара=4 (блокируется до окончания конкурирующей транзакции )
10. DELETE FROM Товар WHERE КодТовара=4 (блокируется до окончания конкурирующей транзакции ) 11. INSERT Товар(Название, остаток) VALUES ('SS',999) (выполняется)
13. ROLLBACK TRANSACTION TRB SELECT @@TRANCOUNT
Таблица 16.2. Уровень изоляции конкурирующей транзакции принят по умолчанию (READ COMMITTED). В примере шаги 4, 6 и 8 демонстрируют блокировку данных, захваченных другой транзакцией, в то время как работа с другими данными разрешается (шаг 10).
Пользователь user1 Конкурирующая транзакция Пользователь user2 Текущая транзакция
USE basa_user2

BEGIN TRANSACTION TRA

USE basa_user2

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

BEGIN TRANSACTION TRB

1. SELECT * FROM Товар 2. SELECT * FROM Товар
3. UPDATE Товар SET остаток=остаток+10 (захватывает данные) 4. SELECT * FROM Товар WHERE КодТовара=4 (блокируется до окончания конкурирующей транзакции )
5. DELETE FROM Товар WHERE КодТовара=4 6. UPDATE Товар SET остаток=остаток+10 WHERE КодТовара=4 (блокируется до окончания конкурирующей транзакции )
7. UPDATE Товар SET остаток=остаток+10 WHERE КодТовара=4 (выполняется той транзакцией, которая первой захватила данные на изменение или удаление) 8. DELETE FROM Товар WHERE КодТовара=4 (блокируется до окончания конкурирующей транзакции )
9. INSERT Товар (Название, остаток) VALUES ('SS',999) 10. INSERT Товар(Название, остаток) VALUES ('SS',999) (выполняется)
11. ROLLBACK TRANSACTION TRA SELECT @@TRANCOUNT 12. ROLLBACK TRANSACTION TRB SELECT @@TRANCOUNT
Таблица 16.3. Уровень изоляции конкурирующей транзакции принят по умолчанию (READ COMMITTED). На шаге 2 транзакция захватила данные чтением и блокирует работу с ними со стороны конкурирующей транзакции (шаги 3, 5), которая может лишь добавлять записи (шаг 7).
Пользователь user1 Конкурирующая транзакция Пользователь user2 Текущая транзакция
USE basa_user2

BEGIN TRANSACTION TRA

USE basa_user2

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

BEGIN TRANSACTION TRB

1. SELECT * FROM Товар 2. SELECT * FROM Товар (захватывает данные)
3. UPDATE Товар SET остаток=остаток+10 WHERE КодТовара=4 (блокируется) 4. SELECT * FROM Товар (блокируется до окончания конкурирующей транзакции )
5. DELETE FROM Товар WHERE КодТовара=4 (блокируется) 6. UPDATE Товар SET остаток=остаток+10 WHERE КодТовара=4 (выполняется, т.к. данные захвачены текущей транзакцией )
7. INSERT Товар (Название, остаток) VALUES ('SS',999) (выполняется) 8. DELETE FROM Товар WHERE КодТовара=4 (выполняется, т.к. данные захвачены текущей транзакцией )
10. ROLLBACK TRANSACTION TRA SELECT @@TRANCOUNT 9. INSERT Товар(Название, остаток) VALUES ('SS',999) (выполняется)
11. ROLLBACK TRANSACTION TRB SELECT @@TRANCOUNT
Таблица 16.4. Уровень изоляции конкурирующей транзакции принят по умолчанию (READ COMMITTED). Пример демонстрирует, что текущая транзакция захватила данные чтением (шаг 2) и блокирует любые действия с ними со стороны конкурирующей транзакции вплоть до вставки данных (шаг 7).
Пользователь user1 Конкурирующая транзакция Пользователь user2 Текущая транзакция
USE basa_user2

BEGIN TRANSACTION TRA

USE basa_user2

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRANSACTION TRB

1. SELECT * FROM Товар 2. SELECT * FROM Товар (захватывает данные)
3. UPDATE Товар SET остаток=остаток+10 WHERE КодТовара=4 (блокируется) 4. SELECT * FROM Товар (выполняется)
5. DELETE FROM Товар WHERE КодТовара=4 (блокируется) 6. UPDATE Товар SET остаток=остаток+10 WHERE КодТовара=4 (выполняется, т.к. данные захвачены текущей транзакцией )
7. INSERT Товар (наименование, остаток) VALUES ('SS',999) (блокируется) 8. DELETE FROM Товар WHERE КодТовара=4 (выполняется, т.к. данные захвачены текущей транзакцией )
10. ROLLBACK TRANSACTION TRA SELECT @@TRANCOUNT 9. INSERT Товар(Название, остаток) VALUES ('SS',999) (выполняется)
11. ROLLBACK TRANSACTION TRB SELECT @@TRANCOUNT
< Лекция 15 || Лекция 16: 1234 || Лекция 17 >
Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Ирина Мельник
Ирина Мельник

Здравствуйте, записалась на курс основы SQL, подскажите, стоимость курса.