71186

Транзакции

Лабораторная работа

Информатика, кибернетика и программирование

Транзакция позволяет объединить операторы в группу и гарантировать что все операции внутри группы будут выполнены успешно. Если часть транзакции выполнится со сбоем, результаты выполнения всех операторов до места сбоя отменятся...

Русский

2014-11-03

496.74 KB

2 чел.

Лабораторные работы по дисциплине «Управление данными»

Лабораторной работе №6

Транзакции.

Транзакция – это последовательность  операторов SQL, выполняющихся как единая операция, которая не прерывается другими клиентами.

Транзакция позволяет объединить операторы в группу и гарантировать что все операции внутри группы будут выполнены успешно. Если часть транзакции выполнится со сбоем, результаты выполнения всех операторов до места сбоя отменятся, приведя базу данных к виду в котором она была до выполнения транзакции.

По умолчанию СУБД MySQL работает в режиме автоматического завершения транзакций, т.е. как только выполняется оператор обновления данных, который модифицирует таблицу, MySQL тут же сохраняет изменения на диске. Для объединения в транзакцию нескольких операторов необходимо отключить этот режим. Это можно осуществить при помощи системной переменной AUTOCOMMIT, значение которой выставляется при помощи следующего выражения

SET AUTOCOMMIT=0;

После отключения режима автоматического завершения транзакций следует использовать оператор COMMIT, чтобы сохранять изменения на диске, либо ROLLBACK, чтобы отменять изменения, выполненные с момента начала транзакции. Для того чтобы включить режим автоматического завершения транзакций, необходимо выполнить оператор

 SET AUTOCOMMIT=1;  

  1.  Создайте базу данных lab_6 и таблицу catalogs с полями Id и Name.

CREATE database lab_6;

USE lab_6;

CREATE table catalogs(

ID int,

NAME varchar(80));

  1.  Попробуйте выполнить следующий запрос.

SET AUTOCOMMIT = 0;

INSERT INTO catalogs VALUES(NULL, 'Переферия');

INSERT INTO catalogs VALUES(NULL, 'Разное');

SELECT * FROM catalogs;

ROLLBACK;

  1.  А теперь вновь посмотрите, что осталось в базе данных

SELECT * FROM catalogs;

  1.  Для того чтобы убедиться в полной изолированности этой транзакции, попробуйте открыть еще одну сессию для работы с базой данных.

4.1. В текущем окне выполните снова (окно №1)

INSERT INTO catalogs VALUES(NULL, 'Переферия');

INSERT INTO catalogs VALUES(NULL, 'Разное');

SELECT * FROM catalogs;

4.2. А в новом окне (окно №2)

SELECT * FROM lab_6.catalogs;

Как вы видите, изменения таблицы в другой сессии не отобразилось. При этом эти сессии запущены от одной учетной записи root.

  1.  Примите сделанные изменения в окне №1 выполнив:

COMMIT;

  1.  Проверьте, что изменилось для сессии №2.

SELECT * FROM lab_6.catalogs;

  1.  Перейдите к окну №1 и обратно включите режим автоматического завершения транзакций:

 SET AUTOCOMMIT=1;

  1.  Проверим, что режим автоматического завершения транзакций снова работает. Выполним в окне №1:

INSERT INTO catalogs VALUES(NULL, 'Видеокарты');

SELECT * FROM catalogs;

 Выполним в окне №2:

SELECT * FROM catalogs;

  1.  Это был один из способов осуществления транзакций,  можно  поступить по – другому, с помощью команды START TRANSACTION; которая временно отменяет автоматическое завершения транзакций, до тех пор пока пользователь введет команду COMMIT или ROLLBACK.

Выполните код:

 START TRANSACTION;

INSERT INTO catalogs VALUES(NULL, 'Процессоры');

INSERT INTO catalogs VALUES(NULL, 'Оперативная память');

SELECT * FROM catalogs;

  1.  Изменения будут приняты тоже только после выполнения команды COMMIT; Однако после этой команды режим автоматического завершения транзакций снова активен. Проверим так ли это. Выполните в окне №1.

COMMIT;

INSERT INTO catalogs VALUES(NULL, 'Жесткие диски');

Проверьте содержимое таблицы в окне №2

SELECT * FROM lab_6.catalogs;

 

Для некоторых операторов нельзя выполнить откат при помощи оператора ROLLBACK.

К их числу относят

  1.  CREATE INDEX,
  2.  DROP INDEX,
  3.  CREATE TABLE,
  4.  DROP TABLE,
  5.  ALTER TABLE,
  6.  CREATE DATABASE,
  7.  DROP DATABASE и др.

Следует избегать помещать их в транзакции с другими операторами.

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

Изолированность транзакций

Таблицы InnoDB предлагают четыре различных уровня изолированности транзакций. В порядке от самого сильного к слабому, уровни изолированности могут быть следующими:

  1.  упорядочение (serializabie);
  2.  повторяемое чтение (repeatable read);
  3.  чтение подтвержденного (read committed);
  4.  чтение неподтвержденного (read uncommitted).

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

Упорядочение (serializabie) — это идеал с точки зрения чистоты и устойчивости. С упорядочением чтение и запись в базе данных должны казаться выполняющимися по очереди, когда записываемые изменения вносятся полностью до начала последующего чтения. При этом транзакции не всегда будут выполняться в неперемежающейся последовательности — многие транзакции не мешают одна другой, но в случае коллизии будут мешать. Блокировка и ожидание вместе с непроизводительными усилиями на предсказание возможных коллизий превращают упорядочение в самый медленный режим изолированности. Если вы захотите использовать этот режим, воспользуйтесь следующей командой:

set transaction isolation level serializable;

Для InnoDB уровнем изолированности по умолчанию является повторяемое чтение (repeatable read). В этом режиме изолированности каждая транзакция работает в изолированной версии таблицы, где каждая строка остается в том виде, в котором она находилась перед началом транзакции. При чтении любой строки гарантируется повторяемость результата.

Если вызвать

select * from account where number=l;

в начале транзакции и выполнять тот же запрос в рамках транзакции позже, вы получите один и тот же результат. Тем не менее существует опасность так называемого фантомного чтения. Возможно, что другая транзакция, которая была только что зафиксирована, добавила в таблицу новые строки. Если выполнить один и тот же запрос с некоторым условием дважды, например

select * from account where balance>1000;

то вполне возможно, что во второй раз вы получите новые строки — фантомные.

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

set transaction isolation level repeatable read;

Если установить для сервера режим чтение подтвержденного (read committed), транзакции уже не будут слишком изолированными. Если выполнить запрос и повторить его позже в рамках той же транзакции, во второй раз вы получите другой результат, если за это время другая транзакция изменит  данные и будет зафиксирована. Если вам потребуется установить этот режим, соответствующая команда должна выглядеть так:

set transaction isolation level read committed;

На самом слабом уровне изолированности, в режиме чтения неподтвержденного (read uncommitted), очевидно уже не только то, что транзакции больше не изолированы, не обеспечивают целостность и, таким образом, соответствие ACID, но и то, что транзакций по сути вообще иметь невозможно. В этом режиме транзакции могут читать изменения, которые вносят другие транзакции, до того, как эти изменения  будут подтверждены (т.е. зафиксированы). Это называют "грязным " чтением. Вы можете допустить это только при исключительно необычных условиях, например, когда вы знаете, что все активные потоки будут либо только читать, либо только записывать данные, но не то и другое одновременно. Чтобы установить режим чтения неподтвержденного, используйте следующую команду:

set transaction isolation level read uncommitted;


 

А также другие работы, которые могут Вас заинтересовать

62414. ПОНЯТИЕ ОБЩЕСТВЕННОГО ПРОГРЕССА 27.5 KB
  Общественный прогресс – совокупность всех поступательных изменений в обществе, его развитие от простого к сложному, переход с более низкого уровня на более высокий. Периоды развития общества: прогресс (от лат. progressus – движение вперед) – направление развития, для которого характерен переход от низшего к высшему...
62418. Принципи стильового оформлення презентацій. Основні принципи дизайну слайдів 35.62 KB
  Мета: навчальна: навчити учнів оформляти слайди згідно принципу стильвого оформлення презентації та основним принципам дизайну слайдів; розвивальна: розвивати вміння та навички редагувати слайди за допомогою додавання та зміни тексту розміщення на слайдах графічних зображень вдалого стильового оформлення та дизайну естетичний смак...
62419. Транскрипционные значки и их произношение 35.06 KB
  he city was built on the swampy land at the mouth of the River Neva. Prominent European and Russian architects worked here. The new capital grew rapidly in wealth and beauty. When World War I began in 1914, the German-sounding name St.
62420. Правовое обеспечение профессиональной деятельности 25.66 KB
  ХП как отрасль права это совокупность правовых норм регулирующих предпринимательские отношения и тесно связанные с ними иные в т. Хозяйственные правоотношения это урегулированные нормами права отношения между субъектами складывающиеся по поводу и в процессе хозяйственной...
62421. СИСТЕМА СРЕДСТВ МАССОВОЙ ИНФОРМАЦИИ 28.21 KB
  План урока: Знакомство с новыми участниками группы. В этом время остальные готовят текст зарисовку; Типология средств массовой информации по видам жанровым отличиям; Игра по теме урока дается краткое описание СМИ надо угадать к какому типу оно относится Игра в слова ассоциации...
62422. СОЦИАЛЬНЫЙ СТАТУС. СОЦИАЛЬНЫЕ РОЛИ 17.56 KB
  Виды классификация социальных статусов: I. Статусы определяемые положением индивида в группе: 1 социальный статус положение человека в обществе которое он занимает как представитель большой социальной группы профессиональной классовой этнической.