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;


 

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

68727. Эпоха Возрождения как канун становления классической науки 40 KB
  В городах стали возникать светские центры науки и искусства деятельность которых находилась вне контроля церкви. В формировании мышления этой эпохи огромное влияние сыграло наследие античной науки. Особенности науки эпохи Возрождения: 1 антисхоластическая направленность взглядов и сочинений...
68729. Ведущие теоретические ориентации зарубежной социальной психологии: психоанализ, бихевиоризм, интеракционизм, когнитивная ориентация, гуманистическая ориентация 30.5 KB
  Функционализм (или функциональная психоло гия) возник под влиянием эволюционной теории в биологии Ч. Дарвина и эволюционной теории социального дарвинизма Г. Спенсера. Г. Спенсер полагал, что основным законом социального развития является закон выживания наиболее приспособленных обществ и социальных групп.
68730. Средневековая философия Запада и Востока – это прежде всего философия общества, для которого характерно господство теологии и религии 41.5 KB
  Характерной чертой средневековой философии является meoцентризм обращение к Богу его сущности как первопричины и первоосновы мира. Бог создал мир из ничего. государственность которая основана на любви к себе доведенной до абсолюта презрения к Богу и град божий – духовную общность которая основана...
68731. Хронические расстройства питания у детей раннего возраста 110.5 KB
  Известно что хронические расстройства питания у детей могут проявляться в виде в различных формах в зависимости от характера нарушений трофики и возраста: Группировка гипотрофий: Дети первых двух лет жизни:I. Гипотрофия хроническое расстройство питания с дефицитом массы тела относительно роста.
68732. Античная Греция: институт проксении 34 KB
  В отношениях между полисами и их гражданами особую роль выполнял такой институт как проксении своеобразный вид гостеприимства. Проксения существовала между отдельными лицами родами племенами и целыми государствами. Проксеном являлся гражданин одного полиса оказывавший услуги гражданам или официальным лицам...
68733. Сущность, задачи и структура финансовой политики государства 21.1 KB
  Сущность задачи и структура финансовой политики государства Финансовая политика совокупность целенаправленных действий с использованием финансовых отношений финансов. Задачами финансовой политики является:обеспечение условий для формирования максимально возможных финансовых ресурсов...
68734. Хирургическая операция. Оперативная хирургическая техника 27.93 KB
  Хирургические инструменты. Абсолютные когда отказ от операции приведет к ухудшению состояния или смерти. А абсолютные к экстренной операции жизненные когда отказ от операции приведет к ухудшению состояния или к смерти в настоящий момент: асфиксии острые кровотечения острые...