71186

Транзакции

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

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

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

Русский

2014-11-03

496.74 KB

3 чел.

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

Лабораторной работе №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;


 

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

33155. Мозговой штурм. Деловая игра для педагогов 34 KB
  Один из вариантов методики мозгового штурма хорошо знаком нам по любимой не одним поколением телезрителей передаче Что Где Когда. Я думаю что для начинающего психолога мучительно размышляющего над вопросом как ему начать работу с педагогами методика мозгового штурма может стать первым шагом в этом направлении.Хочу предложить один из самых простых вариантов методики мозгового штурма который может быть реализован на педагогическом совете в процессе психологического тренинга учителей или как отдельное специальное мероприятие.
33156. НАЗВАНИЯ ОТРЯДОВ И ДЕВИЗЫ 39.5 KB
  ОбаНа Мы не панки не шпана мы ребята ОбаНа. Обана Обана это чудо Обана это класс мы живем совсем не худо вы соскучитесь без нас.
33157. Никогда не заблудишься ! (дополнение к Ориентированию) 20 KB
  Крона деревьев лучше развита на юге. Кора березы на юге эластичнее и светлее. Пологий склон муравейника на юге.
33158. Проведение смены для очень маленьких детей ( самый маленький и предпоследний отряд в лагере - 6-8 лет ) 72 KB
  Команды каждый раз меняем. Под словом эстафета понимается прохождение команды детей по маршруту по карте на которой отмечены места где находятся этапы. Команды одновременно выбегают с начальной точки и проходят все этапы по порядку но начальные этапы сдвинуты и команды встречаются только вовремя перебежек с этапа на этап. Под КВН понимается такое мероприятие в котором участвует несколько команд им выдаются задания и или команда целиком выполняет его или часть команды или по одному участнику.
33159. Клуб «Пластилиновые краски» 119.5 KB
  Ход занятия: Ребята вспоминают приемы рисования пластилином. Ход занятия: Знакомство 10 мин. 10 мин. 30 мин.
33160. Примерный план проведения сбора «Планирование деятельности отряда и дел лагеря» 22 KB
  Задачи: диагностика участников сбора для понимания мотивов участия в деятельности отряда и лагеря организация обмена информацией; обучение формам общения для их дальнейшего применения. Ход сбора: 1. Задача первою этапа сбора вывести ребят на размышления о том Что такое человек Чем он отличается от других существ Что такое гармонично развитый человек .
33161. ADO.NET 96 KB
  Создать таблицу, связанную с таблицей элемента контейнера отношением «один ко многим» (Например, если таблицей для хранения элементов контейнера является таблица Книга, то связанная с ней отношением «один ко многим» может быть таблица АвторКниги, т.к. один автор может написать много книг).
33162. Формы тематических отрядных дел 24 KB
  В ходе обыгрывания и последующего обсуждения различных ситуаций из жизни школьников подростки учатся говорить нет преодолевать конформизм приобретают интерес к поиску умного выхода из затруднительных ситуаций обучаются алгоритму отказа отказсоглашение отказобещание отказальтернатива отказотрицание отказконфликт.
33163. Зимняя смена, о/л «Энергия» 54 KB
  Так как север это очень красивое но в то же время и очень опасное место вы все должны уметь четко и быстро выполнять наши команды что бы не погибнуть Кольцовка что нужно взять в экспедицию на Северный полюс А теперь проверим все ли вы взяли ничего не забыли а может положили чтото лишнее Список экспедиции Проверим все ли в сборе и составим список экспедиции вот вам листы нужно написать свое имя и передать дальше Кольцовка виды передвижения по снегу Как вы думаете на чем нам придется добираться до...