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

创建表:

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;
//

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值