C++ MySQL day9

5.2

事务

什么是事务

事务( Transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成

事务的特性

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)

事务解决转账问题

点击查看代码
DROP PROCEDURE IF EXISTS transfer;
CREATE PROCEDURE transfer(IN transferFrom BIGINT, IN transferTo BIGINT, IN
transferMoney BIGINT(20))
BEGIN
- 定义变量表示执行结果,默认为1
DECLARE result TINYINT(1) DEFAULT 1;
- 声明SQLEXCEPTION处理器,当有SQLEXCEPTION发生时,错误标识符的值设为0
- 发生SQLEXCEPTION时的处理方式:CONTINUE,EXIT
- CONTINUE表示即使有异常发生,也会执行后面的语句
- EXIT表示,有异常发生时,直接退出当前存储过程
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET result = 0;
- 开启事务
START TRANSACTION;
UPDATE account SET balance = balance - transferMoney WHERE account =
transferFrom AND balance

存储过程输出

点击查看代码
DROP PROCEDURE IF EXISTS transfer;
CREATE PROCEDURE transfer(IN transferFrom BIGINT, IN transferTo BIGINT, IN
transferMoney BIGINT(20), OUT result TINYINT(1))
BEGIN
- 为SQL异常声明一个持续处理的处理器,一旦出现异常,则将result的值更改为0
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET result = 0;
- 开启事务
START TRANSACTION;
UPDATE account SET balance = balance - transferMoney WHERE account =
transferFrom AND balance

自定义函数

概念

函数就是在大型数据库系统中,一组为了完成特定功能而存储在数据库中的SQL 语句集,一次编译后永久有效

自定义函数

如何使用自定义函数

语法

点击查看代码
CREATE FUNCTION 函数名称 (参数名1 数据类型, 参数名2 数据类型, . , 参数名n 数据类型])
RETURNS 数据类型
-- 函数特征:
-- DETERMINISTIC: 不确定的
-- NO SQL:没有SQL语句,当然也不会修改数据
-- READS SQL DATA: 只是读取数据,不会修改数据
-- MODIFIES SQL DATA:要修改数据
-- CONTAINS SQL:包含了SQL语句
DETERMINISTIC | NO SQL | READS SQL DATA | MODIFIES SQL DATA | CONTAINS SQL
-- 语句块开始
BEGIN
-- SQL语句集
RETURN 结果;
-- 语句块结束
END


案例:使用函数实现求score表中的成绩最大差值

点击查看代码
CREATE FUNCTION getMaxDiff()
RETURNS DOUBLE(5, 2)
DETERMINISTIC
BEGIN
RETURN (SELECT MAX(score) - MIN(score) FROM score);
END
-- 调用函数
SELECT getMaxDiff();

循环结构

点击查看代码
WHILE 循环条件 DO
-- SQL语句集
END WHILE;
REPEAT
-- SQL语句集
UNTIL 循环终止条件 END REPEAT;
标号: LOOP
-- SQL语句集
IF 循环终止条件 THEN LEAVE 标号;
END IF;
END LOOP;

示例:使用函数实现求0~给定的任意整数的累加和

点击查看代码
DROP FUNCTION IF EXISTS getTotal;
CREATE FUNCTION getTotal(maxNum INT(11))
RETURNS INT(11)
NO SQL
BEGIN
DECLARE i INT(11) DEFAULT 0;
DECLARE total INT(11) DEFAULT 0;
WHILE i <= maxNum DO
		      SET total = total + i;
					SET i=i+1;
		END WHILE;
	RETURN total;
END

SELECT getTotal(100);

posted @ 2025-05-02 23:32  北燃  阅读(19)  评论(0)    收藏  举报