第1关:事务

本文介绍了如何在MySQL中修改存储过程,使其在遇到错误的SQL时不会执行,而是确保事务的正确性。涉及事务的概念、特性(原子性、一致性、隔离性和持久性),以及如何使用`begin`、`commit`和`rollback`来管理和控制事务。
摘要由CSDN通过智能技术生成
任务描述

本关任务:

  1. 修改存储过程,使得存储过程中若有错误的 SQL 则不执行,否则将事务提交;
  2. 使用事务往t_emp表中插入数据。
相关知识

为了完成本关任务,你需要掌握:

  1. 什么是事务;

  2. 事务的开启与提交;

  3. 事务回滚。

什么是事务

可以把一系列要执行的操作称为事务,而事务管理就是管理这些操作要么完全执行,要么完全不执行。

经典的事务举例:A要给B转钱,首先A的钱减少了,但是突然的数据库断电了,导致无法给B加钱,然后由于丢失数据,B不承认收到A的钱;在这里事务就是确保加钱和减钱两个都完全执行或完全不执行,如果加钱失败,那么不会发生减钱。

  • 事务管理的意义:保证数据操作的完整性

  • 事务的特性;

    • 原子性:事务的整个操作是一个整体,不可以分割,要么全部成功,要么全部失败;

    • 一致性:事务操作的前后,数据表中的数据没有变化(按示例中解释为A转钱给B的前后两个人钱的总金额不会改变);

    • 隔离性:事务操作是相互隔离不受影响的;

    • 持久性:数据一旦提交,不可改变,永久的改变数据表数据。

事务的开启与提交

MySQL 命令行的默认下,事务采用自动提交autocommit=1)模式。意味着,当你执行一个修改sql语句,MySQL 会立刻更新存储到磁盘中。也就是会立马执行commit操作。

因此开启一个手动事务必须使用beginstart transaction或者set autocommit=0

 
  1. begin;
  2. #或者
  3. start TRANSACTION;
  4. #或者
  5. set autocommit=0;

commit 表示提交事务,即提交事务的所有操作。具体地说,就是将事务中所有对数据库的更新写回到磁盘上的物理数据库中,事务正常结束。

提交事务也有对应的三种方式:

 
  1. commit;
  2. #或者
  3. commit TRANSACTION;
  4. #或者
  5. commit WORK;

提交事务,意味着将事务开始以来所执行的所有数据修改成为数据库的永久部分,因此也标志着一个事务的结束。一旦执行了该命令,将不能回滚事务。只有在所有修改都准备好提交给数据库时,才执行这一操作。

下面使用两个连接举例说明:

回滚事务

rollback表示事务回滚,即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作(对数据库的更新操作)全部撤销,回滚到事务开始时的状态,同时,系统将释放由事务控制的资源。因此,这条语句也标志着事务的结束。

示例:

编程要求

在右侧编辑器补充代码,完成下列两个任务:

  1. query1.sql中修改存储过程,使得存储过程中若有错误的 SQL 则不执行,否则将事务提交。要完成此任务,你需要知道如何自定义异常:

     
      
    1. declare err int default 0; #定义一个err变量并初始值为0
    2. declare continue handler for sqlexception set err =1; #当有sql异常的时候,sql继续往下执行,并将变量err的值改变为1

    有了变量的值接收是否有异常 SQL,就能方便我们使用判断事务是否提交了,关于更多的自定义异常学习可以学习完本关后自行搜索资料学习。

  2. query2.sqlt_emp表中插入相应数据,注意平台已经为你开启事务

idnamedeptIdsalary
1Nancy3012300
2Tod3035600
3Carly3013200
测试说明

平台会对你编写的代码进行测试:

预期输出:

 
  1. +----+-------+--------+--------+
  2. | id | name | deptId | salary |
  3. +----+-------+--------+--------+
  4. | 1 | Nancy | 301 | 2300 |
  5. | 2 | Tod | 303 | 5600 |
  6. | 3 | Carly | 301 | 3200 |
  7. +----+-------+--------+--------+

开始你的任务吧,祝你成功!

USE mydb;
#请在此处添加实现代码
########## Begin ##########
# 修改存储过程 ———— 向 t_emp 表中插入数据(注意请勿修改提供的代码框架) 
drop procedure if exists mydb.proc_insert;
delimiter $$
create procedure proc_insert()
Begin 
	
 
	#开启事务
	start transaction ;
    insert into t_emp values(1,'Nancy',301,2300);
    insert into t_emp values(2,'Tod',303,5600);
	insert into t_emp values(3,'Carly',301,3200);
	
	#事务提交
	commit;
 
 
END $$
delimiter ;
 
########## End ##########

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小珠佩奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值