八、事务处理
不能回退 SELECT 语句,回退 SELECT 语句也没意义;也不能回退 CREATE 和 DROP 语句 。
MySQL 默认是隐式提交,每执行一条语句就把这条语句当成一个事务然后进行提交 。当出现 START TRANSACTION 语句时,会关闭隐式提交;当 COMMIT 或 ROLLBACK 语句执行后,事务会自动关闭,重新恢复隐式提交 。
通过 set autocommit=0 可以取消自动提交,直到 set autocommit=1 才会提交;autocommit 标记是针对每个连接而不是针对服务器的 。
指令
START TRANSACTION - 指令用于标记事务的起始点 。
SAVEPOINT - 指令用于创建保留点 。
ROLLBACK TO - 指令用于回滚到指定的保留点;如果没有设置保留点,则回退到 START TRANSACTION 语句处 。
COMMIT - 提交事务 。
-- 开始事务START TRANSACTION;-- 插入操作 AINSERT INTO `user`VALUES (1, 'root1', 'root1', 'xxxx@163.com');-- 创建保留点 updateASAVEPOINT updateA;-- 插入操作 BINSERT INTO `user`VALUES (2, 'root2', 'root2', 'xxxx@163.com');-- 回滚到保留点 updateAROLLBACK TO updateA;-- 提交事务,只有操作 A 生效COMMIT;(以下为 DCL 语句用法)九、权限控制
GRANT 和 REVOKE 可在几个层次上控制访问权限:创建账户
整个服务器,使用 GRANT ALL 和 REVOKE ALL;
整个数据库,使用 ON database.*;
特定的表,使用 ON database.table;
特定的列;
特定的存储过程 。
新创建的账户没有任何权限 。
账户用 username@host 的形式定义,username@% 使用的是默认主机名 。
MySQL 的账户信息保存在 mysql 这个数据库中 。
USE mysql;
SELECT user FROM user;
复制代码
CREATE USER myuser IDENTIFIED BY 'mypassword';修改账户名UPDATE user SET user='newuser' WHERE user='myuser';FLUSH PRIVILEGES;删除账户DROP USER myuser;查看权限SHOW GRANTS FOR myuser;授予权限GRANT SELECT, INSERT ON *.* TO myuser;删除权限REVOKE SELECT, INSERT ON *.* FROM myuser;更改密码SET PASSWORD FOR myuser = 'mypass';十、存储过程存储过程可以看成是对一系列 SQL 操作的批处理;创建存储过程
使用存储过程的好处
代码封装,保证了一定的安全性;
代码复用;
由于是预先编译,因此具有很高的性能 。
创建存储过程
命令行中创建存储过程需要自定义分隔符,因为命令行是以 ; 为结束符,而存储过程中也包含了分号,因此会错误把这部分分号当成是结束符,造成语法错误 。
包含 in、out 和 inout 三种参数 。
给变量赋值都需要用 select into 语句 。
每次只能给一个变量赋值,不支持集合的操作 。
DROP PROCEDURE IF EXISTS `proc_adder`;DELIMITER ;;CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_adder`(IN a int, IN b int, OUT sum int)BEGINDECLARE c int;if a is null then set a = 0;end if;if b is null then set b = 0;end if;set sum= a + b;END;;DELIMITER ;使用存储过程set @b=5;call proc_adder(2,@b,@s);select @s as sum;十一、游标游标(cursor)是一个存储在 DBMS 服务器上的数据库查询,它不是一条 SELECT 语句,而是被该语句检索出来的结果集 。
在存储过程中使用游标可以对一个结果集进行移动遍历 。
游标主要用于交互式应用,其中用户需要对数据集中的任意行进行浏览和修改 。
使用游标的四个步骤:
声明游标,这个过程没有实际检索出数据;
打开游标;
取出数据;
关闭游标;
DELIMITER $CREATEPROCEDURE getTotal()BEGINDECLARE total INT;-- 创建接收游标数据的变量DECLARE sid INT;DECLARE sname VARCHAR(10);-- 创建总数变量DECLARE sage INT;-- 创建结束标志变量DECLARE done INT DEFAULT false;-- 创建游标DECLARE cur CURSOR FOR SELECT id,name,age from cursor_table where age>30;-- 指定游标循环结束时的返回值DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;SET total = 0;OPEN cur;FETCH cur INTO sid, sname, sage;WHILE(NOT done)DOSET total = total + 1;FETCH cur INTO sid, sname, sage;END WHILE;CLOSE cur;SELECT total;END $DELIMITER ;-- 调用存储过程call getTotal();十二、触发器触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行 。可以使用触发器来进行审计跟踪,把修改记录到另外一张表中 。
推荐阅读
- 上饶也有一处洞天福地——神农源景区
- 前端测试框架Jest——语法篇
- 分类算法其实也可做回归分析——以knn为例
- 什么是杜比全景声——沉浸式环绕声?
- 今日头条算法原理—— 3分钟了解今日头条推荐算法原理
- 开淘宝店必备的软件 手机淘宝开店软件哪个最好用
- 2020年最值得阅读的十本程序员书
- 医保卡——如何提现、如何使用?
- 网络程序员的一款“军刀”Postman
- 关于Java并发工具,90%的程序员需要了解的那些技术栈
