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;


 

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

25852. Бухгалтерский аутсорсинг 29.5 KB
  Успешно осуществляющиеся на западе аутсорсинговые услуги сегодня находят своего потребителя и в Российской Федерации. Передача части работ на аутсорсинг позволяет сократить издержки так как зачастую услуги аутсорсера стоят намного дешевле чем содержание собственного персонала. По договору аутсорсинга как правило передаются такие функции как: поддержка информационных систем локальных сетей webсайта; защита информации; администрирование компьютерных сетей; разработка внедрение и последующее обслуживание корпоративных программных...
25853. Бухгалтерский аутсорсинг 39.5 KB
  Бухгалтерский аутсорсинг от outsource внешний источник или средства замена наемного труда услугами сторонней компанииспециалиста; передача компании бухгалтерской фирме функции ведения бухгалтерского учета бухгалтерское сопровождение В России бухгалтерский аутсорсинг появился сравнительно недавно 78 лет назад. Основными заказчиками бухгалтерского аутсорсинга еще недавно были иностранные организации работающие в Российской Федерации а также совместные предприятия. Однако сейчас все больше и российских организаций пользуются...
25854. Взаимосвязь финансового и управленческого учета 26 KB
  Аналитическая информация управленческого учета используется исключительно для внутреннего управления. Такое подразделение бухгалтерского учета можно объяснить тем что в принципе вся система бухгалтерского учета является составной частью управленческой системы организации. Общепринятые принципы финансового учета могут действовать также и в управленческом учете поскольку руководители предприятий в своей деятельности не могут руководствоваться исключительно непроверяемыми субъективными оценками и мнениями.
25855. Место и роль финансового анализа в управлении финансами банка 25 KB
  В современном коммерческом банке финансовый анализ представляет собой не просто элемент финансового управления а его основу поскольку финансовая деятельность является преобладающей в банке. Содержание место и роль финансового анализа в банковском бизнесе во многом зависят от специфики деятельности кредитных учреждений связанной с производством услуг финансового характера посредничеством между экономическими агентами; высокой степенью зависимости от клиентской базы; возможностью отсрочки неплатежеспособности по своим обязательствам путем...
25856. Методы определения рейтинга банка 23 KB
  проблемные – банки кот имеют до трех недостатков: убыток на отчетную дату несоблюдение норматива достаточности капитала на отчетную дату недовзнос в фонд обязательных резервов.Генеральный коэффициент надежности уставный капитал активы приносящие доход норматив 1.Мгновенной ликвидности наиболее ликвидные активы обязательства до востребования норматив 2.Кросскоэффициент сумма обязательств активы приносящ доход норматив 3.
25857. Методы оценки и защиты от банковских рисков 24.5 KB
  Суть статистических методов оценки риска заключается в определении вероятности возникновения потерь на основе статистических данных предшествующего периода и установлении зоны риска коэффициента риска и т. Аналитические методы позволяют определить вероятность возникновения потерь на основе математических моделей и используются в основном для анализа риска инвестиционных проектов. Возможно использование таких методов как анализ чувствительности метод корректировки нормы дисконта с учетом риска метод эквивалентов метод сценариев....
25860. Оценка соотношения собственных и привлеченных средств банка 23.5 KB
  развитие; фонд основных средств – создается из прибыли как источник приобретения основных средств Эмиссионный доход – источником является средства от продажи акций по цене выше номинала Прибыль – как превышение доходов над расходами банка. Помимо собственных средств банк пользуется привлеченными средствами.Структура обязательств имеет 2 группы: заемные средства – кредиты ЦБ и кредиты др.