СУБД осень 2012 лекция 5
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
CREATE
[DEFINER = { user | CURRENT_USER }]
FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
func_parameter:
param_name type
type:
Any valid MySQL data type
characteristic:
COMMENT 'string'
| LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS
SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
routine_body:
Valid SQL routine statement
 Разделение логики с другими приложениями. Хранимые
процедуры инкапсулируют функциональность; это
обеспечивает связность доступа к данным и управления ими
между различными приложениями.
 Изоляция пользователей от таблиц базы данных. Это
позволяет давать доступ к хранимым процедурам, но не к
самим данным таблиц.
 Обеспечивает механизм защиты.
 Улучшение выполнения как следствие сокращения сетевого
трафика. С помощью хранимых процедур множество запросов
могут быть объединены.
• Повышение нагрузки на сервер баз данных в связи с тем, что
большая часть работы выполняется на серверной части, а
меньшая - на клиентской.
• Дублирование логики своего приложения в двух местах:
серверный код и код для хранимых процедур, тем самым
усложняя процесс манипулирования данными.
• Миграция с одной СУБД на другую (DB2, SQL Server и др.)
может привести к проблемам.
DELIMITER //
DROP PROCEDURE IF EXISTS p1//
CREATE PROCEDURE `p1` ()
LANGUAGE SQL
DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'A procedure'
BEGIN
SELECT 'Hello World !';
END//
CALL p1()
DELIMITER //
CREATE PROCEDURE `var_proc` (IN paramstr VARCHAR(20))
BEGIN
DECLARE a, b INT DEFAULT 5;
DECLARE str VARCHAR(50);
DECLARE today TIMESTAMP DEFAULT CURRENT_DATE;
DECLARE v1, v2, v3 TINYINT;
INSERT INTO table1 VALUES (a);
SET str = 'I am a string';
SELECT CONCAT(str,paramstr), today FROM table2 WHERE b >=5;
END //
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
[begin_label:] LOOP
statement_list
END LOOP [end_label]
CREATE PROCEDURE doiterate(p1 INT)
BEGIN
label1: LOOP
SET p1 = p1 + 1;
IF p1 < 10 THEN
ITERATE label1;
END IF;
LEAVE label1;
END LOOP label1;
SET @x = p1;
END;
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
CREATE PROCEDURE dowhile()
BEGIN
DECLARE v1 INT DEFAULT 5;
WHILE v1 > 0 DO
...
SET v1 = v1 - 1;
END WHILE;
END;
DECLARE handler_action HANDLER
FOR condition_value [, condition_value] ...
statement
handler_action:
CONTINUE
| EXIT
| UNDO
condition_value:
mysql_error_code
| SQLSTATE [VALUE] sqlstate_value
| condition_name
| SQLWARNING
| NOT FOUND
| SQLEXCEPTION
DECLARE cursor-name CURSOR FOR SELECT ...;
OPEN cursor-name;
FETCH cursor-name INTO variable [, variable];
CLOSE cursor-name;
Declare vBankId integer;
Declare vBankName VARCHAR(50);
Declare vAddress VARCHAR(50);
Declare done integer default 0;
Declare BankCursor Cursor for Select`bank`.`BankId`,`bank`.`BankName`,`bank`.`Ad
dress` FROM `bank`;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
Open BankCursor;
WHILE done = 0 DO
FETCH BankCursor INTO vBankId,vBankName,vAddress;
делаем нужные нам действия
END WHILE;
Close BankCursor;
DELIMITER $$
DROP PROCEDURE IF EXISTS `create_archive`$$
CREATE PROCEDURE `create_archive`(IN current_table VARCHAR(50))
BEGIN
DECLARE template,archive_template VARCHAR(50);
SET archive_template=replace(curdate(),"-","");
SET template=CONCAT(current_table,"_",archive_template);
SET @archive_query:=CONCAT("CREATE TABLE ",template," ENGINE=ARCHIVE AS
(SELECT * FROM ",current_table," )");
PREPARE archive_query FROM @archive_query;
EXECUTE archive_query;
DEALLOCATE PREPARE archive_query;
END$$
EXECUTE stmt_name [USING @var_name [, @var_name] ...]
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_body
trigger_time = BEFORE | AFTER
trigger_event = INSERT | UPDATE | DELETE
CREATE TRIGGER add_count_comment AFTER INSERT ON comments
FOR EACH ROW BEGIN
UPDATE user SET user.countcomment= user.countcomment+1 WHERE user.id = NEW.user_id;
CASE NEW.owner_name
WHEN 'Blog' THEN UPDATE blog SET comment = comment+1 WHERE id = NEW.owner_id ;
WHEN 'Article' THEN UPDATE article SET comment = comment+1 WHERE id = NEW.owner_id ;
WHEN 'PopulatePlace' THEN UPDATE populate_place SET comment = comment+1 WHERE id =
NEW.owner_id ;
END CASE;
CASE NEW.owner_name
WHEN 'Blog' THEN SET usertitle = (select title from blog where id=NEW.owner_id);
WHEN 'Article' THEN SET usertitle = (select title from article where id=NEW.owner_id);
WHEN 'PopulatePlace' THEN SET usertitle = ;
END CASE;
INSERT INTO user_has_events VALUES (NEW.user_id,NEW.id,"Comments",NOW() , usertitle );
END
• START TRANSACTION
• COMMIT
• ROLLBACK
• START TRANSACTION
• COMMIT
• ROLLBACK
START TRANSACTION;
SELECT balance FROM checking WHERE customer_id = 10233276;
UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;
COMMIT;
• Atomicity (Атомарность)
Транзакция должна функционировать как единая неделимая еденица работы
таким образом, чтобы вся транзакция была либо выполнена, либо отменена.
• Consistency (Непротиворечивость)
База данных должна всегда переходить из одного непротиворечивого
состояния в последующее.
• Isolation (Изолированность)
Результаты транзакции обычно невидимы другим транзакциям, пока она не
закончена.
• Durability (Долговечность)
Будучи зафиксированы, внесенные в ходе транзакции изменения становятся
постоянными. Это означает, что изменения должны быть записаны так, чтобы
данные не могли быть потеряны в случае сбоя системы.
Уровень изоляции
Возможность
чернового
чтения
Возможность
невоспроизво
димого чтения
Возможность
фантомного
чтения
Блокировка
чтения
READ UNCOMMITTED Да Да Да Нет
READ COMMITTED Нет Да Да Нет
REPEATABLE READ Нет Нет Да Нет
SERIALIZABLE Нет Нет Нет Да
Уровень изоляции
Возможность
чернового
чтения
Возможность
невоспроизво
димого чтения
Возможность
фантомного
чтения
Блокировка
чтения
READ UNCOMMITTED Да Да Да Нет
READ COMMITTED Нет Да Да Нет
REPEATABLE READ Нет Нет Да Нет
SERIALIZABLE Нет Нет Нет Да
Транзакция #1
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = ‘2002-05-01’;
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = ‘2002-05-02’;
COMMIT;
Транзакция #2
START TRANSACTION;
UPDATE StockPrice SET high = 20.12 WHERE stock_id = 3 and date = ‘2002-05-02’;
UPDATE StockPrice SET high = 47.20 WHERE stock_id = 4 and date = ‘2002-05-01’;
COMMIT;
Транзакция #1
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = ‘2002-05-01’;
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = ‘2002-05-02’;
COMMIT;
Транзакция #2
START TRANSACTION;
UPDATE StockPrice SET high = 20.12 WHERE stock_id = 3 and date = ‘2002-05-02’;
UPDATE StockPrice SET high = 47.20 WHERE stock_id = 4 and date = ‘2002-05-01’;
COMMIT;
SELECT ... FOR UPDATE;
SELECT ... LOCK IN SHARE MODE;
LOCK TABLES
tbl_name [[AS] alias] lock_type
[, tbl_name [[AS] alias] lock_type] ...
lock_type:
READ [LOCAL]
| [LOW_PRIORITY] WRITE
UNLOCK TABLES
SELECT
Подсистема InnoDB должна проверить каждую строку, чтобы убедиться, что она
отвечает двум критериям:
• InnoDB должна найти версию строки, которая по крайней мере такая же старая, как
версия транзакции (то есть ее номер версии должен быть меньше или равен номеру
версии транзакции). Это гарантирует, что либо строка существовала до начала
транзакции, либо транзакция создала или изменила эту строку.
• Версия удаления строки должна быть не определена или ее значение больше, чем
версия транзакции. Это гарантирует, что строка не была удалена до начала
транзакции.
INSERT
InnoDB записывает текущий системный номер версии вместе с новой строкой.
DELETE
InnoDB записывает текущий системный номер версии как идентификатор удаления
строки.
UPDATE
InnoDB создает новую копию строки, используя системный номер версии в качестве
версии новой строки. Она также записывает системный номер версии как версию
удаления старой строки.
Стратегия
блокировки Конкуренция
Накладные
расходы
Подсистемы
хранения
Уровень
таблицы Самая низкая Самые низкие
MyISAM, Merge,
Memory
Уровень строки Высокая Высокие NDB Cluster
Уровень строки
с MVCC Самая высокая Самые высокие
InnoDB, Falcon,
PBXT, solidDB
СУБД осень 2012 лекция 5

More Related Content

PPT
Triggers для Mysql
PPT
0045
PPT
лекц17
PPTX
Индексирование в Magento
PPTX
Разработка расширяемых приложений на Django
PDF
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
PDF
Алексей Плеханов: 25 причин попробовать Laravel
PPTX
Реализация шаблонов корпоративных приложений в Magento
Triggers для Mysql
0045
лекц17
Индексирование в Magento
Разработка расширяемых приложений на Django
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Алексей Плеханов: 25 причин попробовать Laravel
Реализация шаблонов корпоративных приложений в Magento

Viewers also liked (19)

PPTX
Управление продуктом весна 2014 лекция 1
PPT
Web весна 2012 лекция 10
PPTX
C++ осень 2012 лекция 11
PPTX
Java весна 2013 лекция 9
PPTX
Информационная безопасность весна 2013 лекция 4
PPT
Web весна 2012 лекция 3
PPT
Web осень 2012 лекция 9
PPT
Web осень 2012 лекция 2
PPTX
АиСД осень 2012 лекция 8
PPTX
СУБД осень 2012 вестник 2
PDF
C++ осень 2012 лекция 6
PPTX
АиСД осень 2012 лекция 3
PPT
Web осень 2012 лекция 10
PDF
Бизнес и системный анализ весна 2013 лекция 2
PDF
Тестирование весна 2013 лекция 4
PPT
Web осень 2012 лекция 5
PPTX
Java осень 2012 лекция 7
PDF
Безопасность интернет-приложений осень 2013 лекция 1
PPTX
Java весна 2013 лекция 1
Управление продуктом весна 2014 лекция 1
Web весна 2012 лекция 10
C++ осень 2012 лекция 11
Java весна 2013 лекция 9
Информационная безопасность весна 2013 лекция 4
Web весна 2012 лекция 3
Web осень 2012 лекция 9
Web осень 2012 лекция 2
АиСД осень 2012 лекция 8
СУБД осень 2012 вестник 2
C++ осень 2012 лекция 6
АиСД осень 2012 лекция 3
Web осень 2012 лекция 10
Бизнес и системный анализ весна 2013 лекция 2
Тестирование весна 2013 лекция 4
Web осень 2012 лекция 5
Java осень 2012 лекция 7
Безопасность интернет-приложений осень 2013 лекция 1
Java весна 2013 лекция 1
Ad

Similar to СУБД осень 2012 лекция 5 (20)

PPTX
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
ODP
Использование хранимых процедур в MySQL (Константин Осипов)
DOCX
бд шпора2
PPTX
SQL________________________________.pptx
DOC
0044
PPT
PPTX
Транзакции и блокировки в MySql. Теория и практика
PPT
лабраб 7
PDF
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PPTX
СУБД осень 2012 Лекция 2
PPTX
Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...
PPTX
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
PDF
SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...
PDF
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
PPT
работа с базами данных с использованием субд My sql
PPTX
Query perfomance tuning
PDF
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
PDF
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
PDF
Что нужно знать о трёх топовых фичах MySQL
PDF
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
Использование хранимых процедур в MySQL (Константин Осипов)
бд шпора2
SQL________________________________.pptx
0044
Транзакции и блокировки в MySql. Теория и практика
лабраб 7
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
СУБД осень 2012 Лекция 2
Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
работа с базами данных с использованием субд My sql
Query perfomance tuning
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Что нужно знать о трёх топовых фичах MySQL
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
Ad

More from Technopark (20)

PDF
Лекция 11. Вычислительная модель Pregel
PDF
Лекция 14. Hadoop в Поиске Mail.Ru
PDF
Лекция 13. YARN
PDF
Лекция 12. Spark
PDF
Лекция 10. Apache Mahout
PDF
Лекция 9. ZooKeeper
PDF
Лекция 7. Введение в Pig и Hive
PDF
Лекция 6. MapReduce в Hadoop (графы)
PDF
Лекция 5. MapReduce в Hadoop (алгоритмы)
PDF
Лекция 4. MapReduce в Hadoop (введение)
PDF
Лекция 3. Распределённая файловая система HDFS
PDF
Лекция 2. Основы Hadoop
PDF
Лекция 1. Введение в Big Data и MapReduce
PPTX
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
PPT
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
PPTX
СУБД 2013 Лекция №9 "Безопасность баз данных"
PPTX
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
PPTX
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
PPTX
СУБД 2013 Лекция №5 "Определение узких мест"
PPTX
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
Лекция 11. Вычислительная модель Pregel
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 13. YARN
Лекция 12. Spark
Лекция 10. Apache Mahout
Лекция 9. ZooKeeper
Лекция 7. Введение в Pig и Hive
Лекция 6. MapReduce в Hadoop (графы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 4. MapReduce в Hadoop (введение)
Лекция 3. Распределённая файловая система HDFS
Лекция 2. Основы Hadoop
Лекция 1. Введение в Big Data и MapReduce
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...

СУБД осень 2012 лекция 5

  • 2. CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body CREATE [DEFINER = { user | CURRENT_USER }] FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name type func_parameter: param_name type type: Any valid MySQL data type characteristic: COMMENT 'string' | LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } routine_body: Valid SQL routine statement
  • 3.  Разделение логики с другими приложениями. Хранимые процедуры инкапсулируют функциональность; это обеспечивает связность доступа к данным и управления ими между различными приложениями.  Изоляция пользователей от таблиц базы данных. Это позволяет давать доступ к хранимым процедурам, но не к самим данным таблиц.  Обеспечивает механизм защиты.  Улучшение выполнения как следствие сокращения сетевого трафика. С помощью хранимых процедур множество запросов могут быть объединены.
  • 4. • Повышение нагрузки на сервер баз данных в связи с тем, что большая часть работы выполняется на серверной части, а меньшая - на клиентской. • Дублирование логики своего приложения в двух местах: серверный код и код для хранимых процедур, тем самым усложняя процесс манипулирования данными. • Миграция с одной СУБД на другую (DB2, SQL Server и др.) может привести к проблемам.
  • 5. DELIMITER // DROP PROCEDURE IF EXISTS p1// CREATE PROCEDURE `p1` () LANGUAGE SQL DETERMINISTIC SQL SECURITY DEFINER COMMENT 'A procedure' BEGIN SELECT 'Hello World !'; END// CALL p1()
  • 6. DELIMITER // CREATE PROCEDURE `var_proc` (IN paramstr VARCHAR(20)) BEGIN DECLARE a, b INT DEFAULT 5; DECLARE str VARCHAR(50); DECLARE today TIMESTAMP DEFAULT CURRENT_DATE; DECLARE v1, v2, v3 TINYINT; INSERT INTO table1 VALUES (a); SET str = 'I am a string'; SELECT CONCAT(str,paramstr), today FROM table2 WHERE b >=5; END //
  • 7. IF search_condition THEN statement_list [ELSEIF search_condition THEN statement_list] ... [ELSE statement_list] END IF CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement_list] ... [ELSE statement_list] END CASE CASE WHEN search_condition THEN statement_list [WHEN search_condition THEN statement_list] ... [ELSE statement_list] END CASE
  • 8. [begin_label:] LOOP statement_list END LOOP [end_label] CREATE PROCEDURE doiterate(p1 INT) BEGIN label1: LOOP SET p1 = p1 + 1; IF p1 < 10 THEN ITERATE label1; END IF; LEAVE label1; END LOOP label1; SET @x = p1; END;
  • 9. [begin_label:] REPEAT statement_list UNTIL search_condition END REPEAT [end_label] [begin_label:] WHILE search_condition DO statement_list END WHILE [end_label] CREATE PROCEDURE dowhile() BEGIN DECLARE v1 INT DEFAULT 5; WHILE v1 > 0 DO ... SET v1 = v1 - 1; END WHILE; END;
  • 10. DECLARE handler_action HANDLER FOR condition_value [, condition_value] ... statement handler_action: CONTINUE | EXIT | UNDO condition_value: mysql_error_code | SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION
  • 11. DECLARE cursor-name CURSOR FOR SELECT ...; OPEN cursor-name; FETCH cursor-name INTO variable [, variable]; CLOSE cursor-name; Declare vBankId integer; Declare vBankName VARCHAR(50); Declare vAddress VARCHAR(50); Declare done integer default 0; Declare BankCursor Cursor for Select`bank`.`BankId`,`bank`.`BankName`,`bank`.`Ad dress` FROM `bank`; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; Open BankCursor; WHILE done = 0 DO FETCH BankCursor INTO vBankId,vBankName,vAddress; делаем нужные нам действия END WHILE; Close BankCursor;
  • 12. DELIMITER $$ DROP PROCEDURE IF EXISTS `create_archive`$$ CREATE PROCEDURE `create_archive`(IN current_table VARCHAR(50)) BEGIN DECLARE template,archive_template VARCHAR(50); SET archive_template=replace(curdate(),"-",""); SET template=CONCAT(current_table,"_",archive_template); SET @archive_query:=CONCAT("CREATE TABLE ",template," ENGINE=ARCHIVE AS (SELECT * FROM ",current_table," )"); PREPARE archive_query FROM @archive_query; EXECUTE archive_query; DEALLOCATE PREPARE archive_query; END$$ EXECUTE stmt_name [USING @var_name [, @var_name] ...]
  • 13. CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_body trigger_time = BEFORE | AFTER trigger_event = INSERT | UPDATE | DELETE
  • 14. CREATE TRIGGER add_count_comment AFTER INSERT ON comments FOR EACH ROW BEGIN UPDATE user SET user.countcomment= user.countcomment+1 WHERE user.id = NEW.user_id; CASE NEW.owner_name WHEN 'Blog' THEN UPDATE blog SET comment = comment+1 WHERE id = NEW.owner_id ; WHEN 'Article' THEN UPDATE article SET comment = comment+1 WHERE id = NEW.owner_id ; WHEN 'PopulatePlace' THEN UPDATE populate_place SET comment = comment+1 WHERE id = NEW.owner_id ; END CASE; CASE NEW.owner_name WHEN 'Blog' THEN SET usertitle = (select title from blog where id=NEW.owner_id); WHEN 'Article' THEN SET usertitle = (select title from article where id=NEW.owner_id); WHEN 'PopulatePlace' THEN SET usertitle = ; END CASE; INSERT INTO user_has_events VALUES (NEW.user_id,NEW.id,"Comments",NOW() , usertitle ); END
  • 15. • START TRANSACTION • COMMIT • ROLLBACK
  • 16. • START TRANSACTION • COMMIT • ROLLBACK START TRANSACTION; SELECT balance FROM checking WHERE customer_id = 10233276; UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276; UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276; COMMIT;
  • 17. • Atomicity (Атомарность) Транзакция должна функционировать как единая неделимая еденица работы таким образом, чтобы вся транзакция была либо выполнена, либо отменена. • Consistency (Непротиворечивость) База данных должна всегда переходить из одного непротиворечивого состояния в последующее. • Isolation (Изолированность) Результаты транзакции обычно невидимы другим транзакциям, пока она не закончена. • Durability (Долговечность) Будучи зафиксированы, внесенные в ходе транзакции изменения становятся постоянными. Это означает, что изменения должны быть записаны так, чтобы данные не могли быть потеряны в случае сбоя системы.
  • 20. Транзакция #1 START TRANSACTION; UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = ‘2002-05-01’; UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = ‘2002-05-02’; COMMIT; Транзакция #2 START TRANSACTION; UPDATE StockPrice SET high = 20.12 WHERE stock_id = 3 and date = ‘2002-05-02’; UPDATE StockPrice SET high = 47.20 WHERE stock_id = 4 and date = ‘2002-05-01’; COMMIT;
  • 21. Транзакция #1 START TRANSACTION; UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = ‘2002-05-01’; UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = ‘2002-05-02’; COMMIT; Транзакция #2 START TRANSACTION; UPDATE StockPrice SET high = 20.12 WHERE stock_id = 3 and date = ‘2002-05-02’; UPDATE StockPrice SET high = 47.20 WHERE stock_id = 4 and date = ‘2002-05-01’; COMMIT;
  • 22. SELECT ... FOR UPDATE; SELECT ... LOCK IN SHARE MODE; LOCK TABLES tbl_name [[AS] alias] lock_type [, tbl_name [[AS] alias] lock_type] ... lock_type: READ [LOCAL] | [LOW_PRIORITY] WRITE UNLOCK TABLES
  • 23. SELECT Подсистема InnoDB должна проверить каждую строку, чтобы убедиться, что она отвечает двум критериям: • InnoDB должна найти версию строки, которая по крайней мере такая же старая, как версия транзакции (то есть ее номер версии должен быть меньше или равен номеру версии транзакции). Это гарантирует, что либо строка существовала до начала транзакции, либо транзакция создала или изменила эту строку. • Версия удаления строки должна быть не определена или ее значение больше, чем версия транзакции. Это гарантирует, что строка не была удалена до начала транзакции. INSERT InnoDB записывает текущий системный номер версии вместе с новой строкой. DELETE InnoDB записывает текущий системный номер версии как идентификатор удаления строки. UPDATE InnoDB создает новую копию строки, используя системный номер версии в качестве версии новой строки. Она также записывает системный номер версии как версию удаления старой строки.
  • 24. Стратегия блокировки Конкуренция Накладные расходы Подсистемы хранения Уровень таблицы Самая низкая Самые низкие MyISAM, Merge, Memory Уровень строки Высокая Высокие NDB Cluster Уровень строки с MVCC Самая высокая Самые высокие InnoDB, Falcon, PBXT, solidDB