InnoDB存储引擎--2、存储过程

来源:互联网 发布:域名授权系统源码php 编辑:程序博客网 时间:2024/06/10 22:31

创建表:

CREATE TABLE test_load (
a INT NOT NULL AUTO_INCREMENT,
b CHAR(80),
PRIMARY KEY (`a`)
) ENGINE=INNODB;


创建存储过程:

DELIMITER //
CREATE PROCEDURE p_load(COUNT INT UNSIGNED)
BEGIN
DECLARE s INT UNSIGNED DEFAULT 1;
DECLARE c CHAR(80) DEFAULT REPEAT('a', 80);
WHILE s <= COUNT DO
INSERT INTO test_load SELECT NULL,c;
COMMIT;
SET s = s+1;
END WHILE;
END;
//

DELIMITER ;


同上,但是一次性提交事务的存储过程:性能提升

CREATE PROCEDURE p_load(COUNT INT UNSIGNED)
BEGIN
DECLARE s INT UNSIGNED DEFAULT 1;
DECLARE c CHAR(80) DEFAULT REPEAT('a', 80);

START TRANSACTION;
WHILE s <= COUNT DO
INSERT INTO test_load SELECT NULL,c;
SET s = s+1;
END WHILE;

COMMIT;
END;



调用存储过程:

CALL p_load(500000);


参数innodb_flush_log_at_trx_commit 控制重做日志刷新到磁盘的策略。

默认1:事务提交时必须调用一次fsync操作。

0:事务提交时不进行写入重做日志操作,这个操作仅在master thread中完成,而master thread中每1秒会进行一次重做日志文件的fsync操作,

2:事务提交时将重做日志写入重做日志文件,但仅写入文件系统的缓存,不进行fsync操作。这个设置下,当mysql数据库发生宕机而操作系统不发生宕机时,并不会导致事务的丢失。



测试例子,真实情况中为了提高上述存储过程事务的提交性能,应该在50万行记录插入表后进行一次COMMIT操作。

而不是每插入一条记录后进行一次COMMIT


捕捉异常,事务回滚的存储器例子:

DELIMITER //
CREATE PROCEDURE sp_auto_rollback_demo() 
BEGIN 
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK;
SELECT -1;
END;
START TRANSACTION;
INSERT INTO t SELECT 1;
INSERT INTO t SELECT 2;
INSERT INTO t SELECT 1;
INSERT INTO t SELECT 3;
COMMIT;
SELECT 1;
END;
//