СУБД осень 2012 лекция 5
TRANSCRIPT
![Page 1: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/1.jpg)
![Page 2: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/2.jpg)
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
![Page 3: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/3.jpg)
Разделение логики с другими приложениями. Хранимые процедуры инкапсулируют функциональность; это обеспечивает связность доступа к данным и управления ими между различными приложениями.
Изоляция пользователей от таблиц базы данных. Это позволяет давать доступ к хранимым процедурам, но не к самим данным таблиц.
Обеспечивает механизм защиты.
Улучшение выполнения как следствие сокращения сетевого трафика. С помощью хранимых процедур множество запросов могут быть объединены.
![Page 4: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/4.jpg)
• Повышение нагрузки на сервер баз данных в связи с тем, что большая часть работы выполняется на серверной части, а меньшая - на клиентской.
• Дублирование логики своего приложения в двух местах: серверный код и код для хранимых процедур, тем самым усложняя процесс манипулирования данными.
• Миграция с одной СУБД на другую (DB2, SQL Server и др.) может привести к проблемам.
![Page 5: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/5.jpg)
DELIMITER //DROP PROCEDURE IF EXISTS p1//CREATE PROCEDURE `p1` ()
LANGUAGE SQL DETERMINISTIC SQL SECURITY DEFINER COMMENT 'A procedure'
BEGINSELECT 'Hello World !';
END//
CALL p1()
![Page 6: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/6.jpg)
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 //
![Page 7: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/7.jpg)
IF search_condition THEN statement_list[ELSEIF search_condition THEN statement_list] ...[ELSE statement_list]
END IF
CASE case_valueWHEN when_value THEN statement_list[WHEN when_value THEN statement_list] ...[ELSE statement_list]
END CASE
CASEWHEN search_condition THEN statement_list[WHEN search_condition THEN statement_list] ...[ELSE statement_list]
END CASE
![Page 8: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/8.jpg)
[begin_label:] LOOPstatement_list
END LOOP [end_label]
CREATE PROCEDURE doiterate(p1 INT)BEGINlabel1: LOOPSET p1 = p1 + 1;IF p1 < 10 THENITERATE label1;
END IF;LEAVE label1;
END LOOP label1;SET @x = p1;
END;
![Page 9: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/9.jpg)
[begin_label:] REPEATstatement_list
UNTIL search_conditionEND REPEAT [end_label]
[begin_label:] WHILE search_condition DOstatement_list
END WHILE [end_label]
CREATE PROCEDURE dowhile()BEGINDECLARE v1 INT DEFAULT 5;WHILE v1 > 0 DO...SET v1 = v1 - 1;
END WHILE;END;
![Page 10: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/10.jpg)
DECLARE handler_action HANDLERFOR 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
![Page 11: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/11.jpg)
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`.`Address` FROM `bank`;DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;Open BankCursor;WHILE done = 0 DOFETCH BankCursor INTO vBankId,vBankName,vAddress;делаем нужные нам действия
END WHILE;Close BankCursor;
![Page 12: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/12.jpg)
DELIMITER $$DROP PROCEDURE IF EXISTS `create_archive`$$CREATE PROCEDURE `create_archive`(IN current_table VARCHAR(50))BEGINDECLARE 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] ...]
![Page 13: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/13.jpg)
CREATE[DEFINER = { user | CURRENT_USER }]TRIGGER trigger_name trigger_time trigger_eventON tbl_name FOR EACH ROW trigger_body
trigger_time = BEFORE | AFTER
trigger_event = INSERT | UPDATE | DELETE
![Page 14: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/14.jpg)
CREATE TRIGGER add_count_comment AFTER INSERT ON commentsFOR EACH ROW BEGIN
UPDATE user SET user.countcomment= user.countcomment+1 WHERE user.id = NEW.user_id;
CASE NEW.owner_nameWHEN '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_nameWHEN '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
![Page 15: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/15.jpg)
• START TRANSACTION
• COMMIT
• ROLLBACK
![Page 16: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/16.jpg)
• 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;
![Page 17: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/17.jpg)
• Atomicity (Атомарность)Транзакция должна функционировать как единая неделимая еденица работы таким образом, чтобы вся транзакция была либо выполнена, либо отменена.
• Consistency (Непротиворечивость)База данных должна всегда переходить из одного непротиворечивого состояния в последующее.
• Isolation (Изолированность)Результаты транзакции обычно невидимы другим транзакциям, пока она не закончена.
• Durability (Долговечность)Будучи зафиксированы, внесенные в ходе транзакции изменения становятся постоянными. Это означает, что изменения должны быть записаны так, чтобы данные не могли быть потеряны в случае сбоя системы.
![Page 18: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/18.jpg)
Уровень изоляции
Возможность чернового чтения
Возможность невоспроизводимого чтения
Возможность фантомного чтения
Блокировка чтения
READ UNCOMMITTED Да Да Да Нет
READ COMMITTED Нет Да Да Нет
REPEATABLE READ Нет Нет Да Нет
SERIALIZABLE Нет Нет Нет Да
![Page 19: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/19.jpg)
Уровень изоляции
Возможность чернового чтения
Возможность невоспроизводимого чтения
Возможность фантомного чтения
Блокировка чтения
READ UNCOMMITTED Да Да Да Нет
READ COMMITTED Нет Да Да Нет
REPEATABLE READ Нет Нет Да Нет
SERIALIZABLE Нет Нет Нет Да
![Page 20: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/20.jpg)
Транзакция #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;
![Page 21: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/21.jpg)
Транзакция #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;
![Page 22: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/22.jpg)
SELECT ... FOR UPDATE;
SELECT ... LOCK IN SHARE MODE;
LOCK TABLEStbl_name [[AS] alias] lock_type[, tbl_name [[AS] alias] lock_type] ...
lock_type:READ [LOCAL]
| [LOW_PRIORITY] WRITE
UNLOCK TABLES
![Page 23: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/23.jpg)
SELECTПодсистема InnoDB должна проверить каждую строку, чтобы убедиться, что она отвечает двум критериям:• InnoDB должна найти версию строки, которая по крайней мере такая же старая, как версия транзакции (то есть ее номер версии должен быть меньше или равен номеру версии транзакции). Это гарантирует, что либо строка существовала до начала транзакции, либо транзакция создала или изменила эту строку.• Версия удаления строки должна быть не определена или ее значение больше, чем версия транзакции. Это гарантирует, что строка не была удалена до начала транзакции.INSERTInnoDB записывает текущий системный номер версии вместе с новой строкой.DELETEInnoDB записывает текущий системный номер версии как идентификатор удаления строки.UPDATEInnoDB создает новую копию строки, используя системный номер версии в качестве версии новой строки. Она также записывает системный номер версии как версию удаления старой строки.
![Page 24: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/24.jpg)
Стратегия блокировки Конкуренция
Накладные расходы
Подсистемы хранения
Уровень таблицы Самая низкая Самые низкие
MyISAM, Merge, Memory
Уровень строки Высокая Высокие NDB ClusterУровень строки с MVCC Самая высокая Самые высокие
InnoDB, Falcon, PBXT, solidDB
![Page 25: СУБД осень 2012 лекция 5](https://reader033.vdocuments.net/reader033/viewer/2022052911/559e08461a28ab88508b474b/html5/thumbnails/25.jpg)