创建表:
创建存储过程:
每次执行插入,提交一次
跟load0,没有什么区别因为mysql默认开启自动提交
所有插入一次提交:
执行存储过程:
受影响的行: 0
时间: 26.520s
受影响的行: 1
时间: 0.483s
我的计算机时间已经15:56了,事务还没有结束,前台调用存储过程虽然返回快,但后台事务还在运行
受影响的行: 0
时间: 0.462s
查看事务表为空;
[color=green]从以上三个可以分析出,load0的执行时间较长,这是由于,每次提交,mysql都要写重做日志redo(ib_logfile0,1oad1虽然时间前台时间不长,但事务在后台运行,load3由于只做一次重做日志所以很快,当然我们是建议,不要在循环中事务提交,而是待所有语句执行完一起提交,最好不要在存储过程中开启事务,因为如果发生回滚,不知道出现什么错误,最好在代码中控制[/color]
如下:
CREATE TABLE `role` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=40006 DEFAULT CHARSET=utf-8;
创建存储过程:
每次执行插入,提交一次
DELIMITER $$
CREATE PROCEDURE load0(count INT UNSIGNED,iname varchar(50),iage INT)
BEGIN
DECLARE s INT UNSIGNED DEFAULT 1;
START TRANSACTION;
WHILE s<count DO
INSERT INTO role(name,age)VALUES(iname,iage);
SET s=s+1;
COMMIT;
END WHILE;
END$$
DELIMITER ;
跟load0,没有什么区别因为mysql默认开启自动提交
DELIMITER $$
CREATE PROCEDURE load1(count INT UNSIGNED,iname varchar(50),iage INT)
BEGIN
DECLARE s INT UNSIGNED DEFAULT 1;
START TRANSACTION;
WHILE s<count DO
INSERT INTO role(name,age)VALUES(iname,iage);
SET s=s+1;
END WHILE;
END$$
DELIMITER ;
所有插入一次提交:
DELIMITER $$
CREATE PROCEDURE load2(count INT UNSIGNED,iname varchar(50),iage INT)
BEGIN
DECLARE s INT UNSIGNED DEFAULT 1;
START TRANSACTION;
WHILE s<count DO
INSERT INTO role(name,age)VALUES(iname,iage);
SET s=s+1;
END WHILE;
COMMIT;
END$$
DELIMITER ;
执行存储过程:
call load0(10000,'jack',23);
[SQL]call load0(10000,'jack',23);
受影响的行: 0
时间: 26.520s
truncate table role;
[SQL]call load1(10000,'jack',23);
受影响的行: 1
时间: 0.483s
mysql> select * from information_schema.INNODB_TRX;
+--------+-----------+---------------------+-----------------------+------------------+------------+---------------------+-----------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+------------------+----------------------------+
| trx_id | trx_state | trx_started | trx_requested_lock_id | trx_wait_started | trx_weight | trx_mysql_thread_id | trx_query | trx_operation_state | trx_tables_in_use | trx_tables_locked | trx_lock_structs | trx_lock_memory_bytes | trx_rows_locked | trx_rows_modified | trx_concurrency_tickets | trx_isolation_level | trx_unique_checks | trx_foreign_key_checks | trx_last_foreign_key_error | trx_adaptive_hash_latched | trx_adaptive_hash_timeout | trx_is_read_only | trx_autocommit_non_locking |
+--------+-----------+---------------------+-----------------------+------------------+------------+---------------------+-----------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+------------------+----------------------------+
| 27177 |[color=red] RUNNING[/color] | [color=red]2016-07-29 15:53:43[/color] | NULL | NULL | 10000 | 21 | NULL | NULL | 0 | 0 | 1 | 360 | 0 | 9999 | 0 | REPEATABLE READ | 1 | 1 | NULL | 0 | 10000 | 0 | 0 |
+--------+-----------+---------------------+-----------------------+------------------+------------+---------------------+-----------+---------------------+-------------------+-------------------+------------------+-----------------------+-----------------+-------------------+-------------------------+---------------------+-------------------+------------------------+----------------------------+---------------------------+---------------------------+
我的计算机时间已经15:56了,事务还没有结束,前台调用存储过程虽然返回快,但后台事务还在运行
truncate table role;
call load2(10000,'jack',23);
[SQL]call load2(10000,'jack',23);
受影响的行: 0
时间: 0.462s
select * from information_schema.INNODB_TRX;
查看事务表为空;
[color=green]从以上三个可以分析出,load0的执行时间较长,这是由于,每次提交,mysql都要写重做日志redo(ib_logfile0,1oad1虽然时间前台时间不长,但事务在后台运行,load3由于只做一次重做日志所以很快,当然我们是建议,不要在循环中事务提交,而是待所有语句执行完一起提交,最好不要在存储过程中开启事务,因为如果发生回滚,不知道出现什么错误,最好在代码中控制[/color]
如下:
try{
con.setautocommint(false)
con.commit();
}
catch(SQLException e){
con.rollback();
}