MySQL存储过程 事务 简介及两者之间的关系

存储过程 Stored Procedure

定义

MySQL中存储过程与存储对象等的关系
在这里插入图片描述
概要定义

MySQL手册

红框翻译:

This chapter discusses stored database objects that are defined in terms of SQL code that is stored on the server for later execution.
本章讨论在SQL模式中定义的数据库存储对象,存储对象存储在服务器上,用于后续执行。

Stored procedure: An object created with CREATE PROCEDURE and invoked using the CALL statement. A procedure does not have a return value but can modify its parameters for later inspection by the caller. It can also generate result sets to be returned to the client program.
存储过程: 使用CREATE PROCEDURE创建,使用CALL语句调用。存储过程没有返回值,但是调用者可通过修改参数以用于后续检查。存储过程也可以返回结果集给客户端程序。

注意:

存储过程没有返回值, 可理解为:虽然没有 return 语句

存储过程也可以返回结果集给客户,可理解为:仍然会有数据返回给调用者(客户端)

测试:
在这里插入图片描述
执行之后的结果:
在这里插入图片描述

一般定义

在这里插入图片描述
红框翻译:

Each stored program contains a body that consists of an SQL statement. This statement may be a compound statement made up of several statements separated by semicolon (😉 characters. For example, the following stored procedure has a body made up of a BEGIN … END block that contains a SET statement and a REPEAT loop that itself contains another SET statement:
每个存储程序都包含一个有SQL语句组成的主体。这些语句可以是组合语句,组合语句之间用分号(;)分割。例如,下面的存储过程包含了一个由BEGIN…END语句块组成的主体,里面有SET语句,也有REPEAT语句。

CREATE PROCEDURE dorepeat(p1 INT)
BEGIN
  SET @x = 0;
  REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
END;

事务 Transaction

定义

transaction
Transactions are atomic units of work that can be committed or rolled back. When a transaction makes multiple changes to the database, either all the changes succeed when the transaction is committed, or all the changes are undone when the transaction is rolled back.
Database transactions, as implemented by InnoDB, have properties that are collectively known by the acronym ACID, for atomicity, consistency, isolation, and durability.
See Also ACID, commit, isolation level, lock, rollback.

以上摘自MySQL8官方手册—>MySQL Glossary

翻译:
事务是一项任务的原子单元,可以被提交或者回滚。当一个事务对数据库进行了多处改变,当事务提交时,所有的改变都要成功,事务回滚时,所有的改变都会撤销。
数据库事务由InnoDB实现,事务具有ACID属性,原子性,一致性,隔离性,和持久性。

相关关键词

在这里插入图片描述

  • START TRANSACTION / BEGIN 开启一个新事务

注意:这里的BEGIN和存储过程中的BEGIN…END块不一样的

演示

测试表数据

在这里插入图片描述
START TRANSACTION 启动事务

START TRANSACTION;
-- BEGIN;
INSERT INTO dept_inf(NAME,REMARK) VALUES('BEGIN','...END');

INSERT INTO dept_inf(NAME2,REMARK2) VALUES('BEGIN','...END');

SELECT * FROM dept_inf;
COMMIT;

在这里插入图片描述
验证:查看数据库表,是否有数据插入?

在这里插入图片描述
使用BEGIN开启一个新事务,与START TRANSACTION一致,演示略。。。

存储过程与事务的关系

  • 存储过程与事务本质上是相互独立的两个东西,不是一个维度的(参见上面的定义)

  • 事务中开启事务的关键字BEGIN与存储过程中的BEGIN…END块,不能混淆,各是各的

  • 当然可以在存储过程中,添加一个事务进去,见下面演示:

演示

表中初始数据,如下:
在这里插入图片描述

带事务的存储过程:

CREATE DEFINER=`root`@`%` PROCEDURE `my_proced`()
BEGIN

START TRANSACTION;
INSERT INTO dept_inf(NAME,REMARK) VALUES('测试BEGIN','...END');

INSERT INTO dept_inf(NAME2,REMARK2) VALUES('测试BEGIN','...END');

SELECT * FROM dept_inf WHERE ID=1;

COMMIT;

SELECT * FROM dept_inf WHERE ID=2;

END

在这里插入图片描述
执行存储过程
在这里插入图片描述
在这里插入图片描述

遗留问题

事务

START TRANSACTION;
-- BEGIN;
INSERT INTO dept_inf(NAME,REMARK) VALUES('BEGIN','...END');

INSERT INTO dept_inf(NAME2,REMARK2) VALUES('BEGIN','...END');

SELECT * FROM dept_inf;
COMMIT;

连续执行2次或2次以上,只有第一次,数据库表才不会插入数据。第2次及以后都会插入数据。

在这里插入图片描述
关闭后,重新打开,有会出现同样的情况,第一次不插入数据,后面的插入数据

在这里插入图片描述

待解决上面遗留问题

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值