MySQL 笔记

自定义函数

存储过程

事务

在学习韩顺平的 MySQL 课程时,看到了如下 SQL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-- 创建存储过程 insert_many_emp,用于循环插入大量随机 emp 雇员数据
CREATE PROCEDURE insert_many_emp(IN start_id INT, IN call_num INT)
BEGIN
DECLARE i INT DEFAULT 0;
# MySQL 默认开启事务自动提交模式,每条 SOL 语句都会被当做一个单独的事务自动执行
# 因此每插入一条数据,事务即完成,从而都会即刻自动提交一次
# 为了提高效率,这里使用 SET autocommit 语句设置事务的自动提交模式
SET autocommit = 0;
REPEAT
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES ((start_id + i), rand_string(6), 'SALESMAN', 0001, CURDATE(), 2000, 400, rand_num());
SET i = i + 1;
UNTIL (i = call_num)
END REPEAT;
# 插入大量随机雇员数据后,整体进行提交
COMMIT;
# 恢复默认开启事务自动提交模式
SET autocommit = 1;
END$$

上面的注释应该讲 SET autocommit = 0 解释清楚了,但这里非常有必要再额外补充 SET autocommit = 0start transaction 的区别:

总结下:两种方式都可以用于事务,但非常不推荐使用 SET autocommit = 0。这样设置以后,相当于强制所有人都默认关闭了自动提交,但并不是每个人都知道他们使用了,也可能另外一个 DBA 又重新开启了自动提交,这就带来了很多混乱!