码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 干货 | 在存储过程中使用事务来防止数据不一致


    在认识数据库事务文章中,我们探究了事务是如何通过保证使用事务执行的所有操作同时成功或同时失败来防止数据丢失和不一致。在今天的后续文章中,我们将学习如何在存储过程中使用事务,以确保所涉及的所有表保持一致状态。

    关于 sp_delete_from_table 存储过程

    如果你阅读过我以前的任何文章,你可能都知道我经常使用 Sakila 示例数据库来说明新概念。那么为何不使用它?它专门作为 MySQL 的学习数据库而开发。如果你尚未知道它是什么,我可以告诉你 Sakila 示例数据库包含与虚拟电影租赁商店链有关的数据。除了表和视图之外,你还可以找到用户函数、触发器、查询和存储过程,这些都是最常用的数据库对象和任务。

    与本文相关的存储过程之一是 sp_delete_from_table。它接受以下三个输入参数:

    • @table:要从中删除行的表的名称。
    • @whereclause:用于标识要删除哪些行的条件。
    • @delcnt:我们希望删除多少行。

    该过程返回 @actcnt(bigint)输出参数,它包含实际删除的行数。

    以下是 Navicat Premium 中显示的完整定义:

    重要的事务语句

    关系数据库为我们提供了一些重要的语句来控制交易:

    • 若要开始事务,请使用 BEGIN TRANSACTION 语句。BEGIN 或 BEGIN WORK 都是 BEGIN TRANSACTION 的别名。你可以在 sp_delete_from_table 过程的第 17 行找到它。
    • 若要提交当前事务并使它的更改永久生效,请使用 COMMIT 语句。这发生在过程的第 32 行。
    • 若要回滚当前事务并取消其更改,请使用 ROLLBACK 语句。在代码中有两种情况:
      1. 如果该语句将删除表中的所有行,则会显示一条消息,并在第 26 行回滚该事务。
      2. 如果删除的行数与预期的行数不匹配,则会再次显示一条消息,并回滚事务。这发生在第 38 行。
    • 若要禁用或启用当前事务的自动提交模式,请使用 SET autocommit 语句。默认情况下,某些数据库(例如 MySQL)在默认启用 autocommit 模式的情况下运行。这意味着,当不在事务内时,每个语句都是原子的,就像被 START TRANSACTION 和 COMMIT 围住一样。你不能使用 ROLLBACK 撤消语句的效果。但是,如果在语句运行期间发生错误,则会回滚该语句。由于大多数工作是在 sp_delete_from_table 过程中的事务内进行的,因此不需要 SET autocommit 语句。

    测试事务回滚

    由于我们知道如果预期计数与实际删除的行数不匹配,则 sp_delete_from_table 过程将会中止,因此可以通过确保 @whereclause 条件将删除表中的每一行或仅提供一个我们知道不匹配的 @delcnt 值来测试回滚。让我们尝试后者。

    在 Navicat 中,我们可以通过“运行”按钮在编辑器运行存储过程。点击它会弹出一个接受输入参数的对话框(可以忽略输出参数):

    过程终止后,可以在“信息”选项卡中看到输出信息。我们可以看到它已按预期回滚:

    总结

    在今天的文章中,我们学习了如何在存储过程中使用事务,以确保无论结果如何,所涉及的所有表均保持一致状态。如果你对 Navicat Premium 感兴趣,可以免费试用 14 天!

    往期回顾

    Navicat 被投毒了 | 真相来了!

    盗版引发设备瘫痪

    Navicat 16.1 为OceanBase 社区版

    Navicat 成为信通院数据库创新实验室成员

    Navicat 学术伙伴计划 - 免费教育版申请

    Navicat 技术智库 - 实战演练与各类热门问题解答

    免费试用攻略 | Navciat 16 数据库管理工具

  • 相关阅读:
    Python之FastAPI返回音视频流
    Linux系统进程的个人理解和解释
    达美乐面试(部分)(未完全解析)
    Java中synchronized:特性、使用、锁机制与策略简析
    修复MybatisX1.4.17版本插件误报@Mapkey is required错误
    会议OA之我的会议(排座&送审)
    Python Flask框架-开发简单博客-定义和操作数据库
    通过Native Memory Tracking查JVM的线程内存使用(线上JVM排障之九)
    es Elasticsearch 六 java api spirngboot 集成es
    android 性能优化之内存泄漏分析工具-Mat使用
  • 原文地址:https://blog.csdn.net/weixin_53935287/article/details/126464869
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号