MySQL触发器和事务

news/2024/12/20 20:16:40/文章来源:https://www.cnblogs.com/cloudwangsa/p/18619921

MySQL触发器和事务

触发器(Trigger)

触发器是一种自动化的数据库对象,它在执行特定的 SQL 操作(如 INSERTUPDATEDELETE)时被自动触发。它可以在表上定义,并在特定事件发生时执行自定义的 SQL 语句。

触发器的种类和时机

在实际使用中,MySQL 所支持的触发器有三种:INSERT 触发器、UPDATE 触发器和 DELETE 触发器。

  • INSERT 触发器

    在 INSERT 语句执行之前或之后响应的触发器。

  • UPDATE 触发器

    在 UPDATE 语句执行之前或之后响应的触发器。

  • DELETE 触发器

    在 DELETE 语句执行之前或之后响应的触发器。

时机:触发器有两种时机可以触发:

  • BEFORE:在事件操作之前执行触发器。
  • AFTER:在事件操作之后执行触发器。
  • 语法:
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN执行语句列表
ENDFOR EACH ROW 是告诉数据库触发器对每一行操作分别进行处理。例如,如果一次插入了多行数据,触发器会对每一行数据分别执行一次触发器中的逻辑代码。
使用场景: 当你需要根据插入、更新或删除的每一行数据进行特定操作时,需要使用 FOR EACH ROW。

NEWOLD 的定义

NEW

  • NEW 用来引用触发器执行时的“新”数据,表示插入或更新操作之后的数据。
  • INSERTUPDATE 触发器中使用。

OLD

  • OLD 用来引用触发器执行时的“旧”数据,表示更新或删除操作之前的数据。
  • UPDATEDELETE 触发器中使用。
  1. NEW 的使用:
  • INSERT 触发器中NEW 表示即将插入的数据。
  • UPDATE 触发器中NEW 表示更新后(即新的)数据。
  1. OLD 的使用:
  • DELETE 触发器中OLD 表示被删除的数据。
  • UPDATE 触发器中OLD 表示更新前(即旧的)数据。

old结合delete使用例子

mysql> select * from category  where btypeid=2;
+---------+-----------+
| bTypeId | bTypeName |
+---------+-----------+
|       2 | 网站      |
+---------+-----------+
1 row in set (0.00 sec)mysql> DELIMITER $
mysql> create trigger drop_test after delete-> on category for each row-> begin-> delete from books.books where btypeid=old.btypeid;-> end-> $
Query OK, 0 rows affected (0.01 sec)mysql> delimiter ;
mysql> delete from category where btypeid=2;
Query OK, 1 row affected (0.00 sec)mysql> select * from category where btype=2;
ERROR 1054 (42S22): Unknown column 'btype' in 'where clause'
mysql> select * from category where btypeid=2;
Empty set (0.00 sec)mysql> select * from books where btypeid=2;
Empty set (0.00 sec)

old结合update使用例子

mysql> delimiter $
mysql> create trigger updata_test after update-> on category for each row-> begin-> update books set btypeid=new.btypeid where btypeid=old.btypeid-> end-> $mysql> select btypeid from category where btypeid=3;
+---------+
| btypeid |
+---------+
|       3 |
+---------+
1 row in set (0.00 sec)mysql> select btypeid from books where btypeid=3;
+---------+
| btypeid |
+---------+
| 3       |
| 3       |
| 3       |
| 3       |
+---------+
4 rows in set (0.00 sec)mysql> update category set btypeid=2 where btypeid=3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select btypeid from category where btypeid=3;
Empty set (0.00 sec)mysql> select btypeid from books where btypeid=3;
Empty set (0.00 sec)

拒绝更新表的内容

mysql> create trigger not_update_student5 before update on student5 for each row-> begin-> set new.id=old.id,new.name=old.name,new.age=old.age;-> end%

事务

MySQL事务是数据库管理系统提供的一种机制,用于保证一组操作的完整性和一致性。事务可以将多个数据库操作封装为一个单一的操作单元,要么全部执行,要么全部不执行,确保数据的一致性和完整性。

MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型不支持!

MySQL事务是数据库管理系统提供的一种机制,用于保证一组操作的完整性和一致性。事务可以将多个数据库操作封装为一个单一的操作单元,要么全部执行,要么全部不执行,确保数据的一致性和完整性。

事务的四个基本特性(ACID特性)

1. 原子性(Atomicity)
  • 简单说法:要么全部做,要么全部不做。
  • 举个例子:你在银行转账时,如果转账失败,你的钱不会先从你的账户扣除再失败;它要么全成功,要么全失败,没有中间状态。
2. 一致性(Consistency)
  • 简单说法:事务前后,数据库的数据应该始终符合规则。
  • 举个例子:比如你在转账时,银行账户的总金额应该始终保持一致。无论转账成功还是失败,数据库中的数据在开始前和结束后都应该是符合预期的,不会因为事务的进行而变得不正常。
3. 隔离性(Isolation)
  • 简单说法:事务之间互不干扰。
  • 举个例子:假设有两个用户同时在银行做转账操作,一个正在从A账户转100元到B账户,另一个正在从B账户转100元到C账户。隔离性确保了一个事务的操作不会影响另一个事务的结果,直到事务完全完成。
4. 持久性(Durability)
  • 简单说法:一旦事务完成,数据就永远保存在数据库里。
  • 举个例子:你在银行转账时,如果转账成功了,系统会把这笔钱的变动永久记录下来。如果系统崩溃了,转账依然有效,不会丢失。
用BEGIN或START TRANSACTION,ROLLBACK,COMMIT来实现事务
START TRANSACTION | BEGIN  #开启事务
COMMIT                   #提交当前事务,执行永久操作。
ROLLBACK       #回滚当前事务到开始点,取消上一次开始点后的所有操作。MYSQL默认是自动提交的,也就是你提交一个SQL QUERY,它就直接执行!
SET AUTOCOMMIT = {0 | 1} 设置事务是否自动提交,默认是自动提交的。0:禁止自动提交1:开启自动提交。

事务的使用示例

假设我们有一个银行转账的场景,用户A将100元转账给用户B。

-- 开始事务
START TRANSACTION;-- 用户A账户扣款 100
UPDATE accounts SET balance = balance - 100 WHERE user_id = 'A';-- 用户B账户加款 100
UPDATE accounts SET balance = balance + 100 WHERE user_id = 'B';-- 如果没有错误,提交事务
COMMIT;
-- 如果在这两个操作之间发生了错误,例如,扣款操作成功,但加款操作失败,则可以通过回滚操作来撤销前面已经完成的操作:
ROLLBACK;

你遇到的情况是,虽然你执行了 ROLLBACK,但是数据并没有回滚。原因在于你执行的操作实际上已经被提交了,而在 COMMIT 之后执行的 ROLLBACK 是无法撤销已经提交的事务的。

如果想要回滚就不能加上COMMIT;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/856054.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux学习笔记(一) Linux目录结构

下图显示的为Linux中的目录结构:/bin[常用](/usr/bin、/usr/local/bin) 是Binary(二进制)的缩写,这个目录存放着经常使用的命令。 /sbin(/usr/sbin、/usr/local/sbin) s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。 /home[常用] 存放普通用户的家目…

数据库审计与监控

title: 数据库审计与监控 date: 2024/12/20 updated: 2024/12/20 author: cmdragon excerpt: 数据库审计与监控是确保数据库安全性和性能的关键环节。通过实施有效的审计策略,可以追踪用户活动,监控数据访问与修改,从而及时发现潜在的安全威胁和性能瓶颈。探讨数据库审计的基…

Java实现单词的翻译(详解爬虫操作)

JAVA通过Crawler实现英语单词的翻译首先声明一点,这种方法仅限于低频次的交互来获取翻译信息,一旦一秒内大量的请求会被重定向,那就直接不能用了 如果希望可以批量查询英语单词翻译,可以查看我的下一篇博客。接着我们上一讲Java如何用HaspMap统计次数并排序详解 - ivanlee7…

实用工具:Calibre 7.22最新版 一款Window电子书管理工具和阅读器便携版

📢提示:文章排版原因,链接放在文章结尾👇👇,往下翻就行 📢提示:文章排版原因,链接放在文章结尾👇👇,往下翻就行 前言 初识Calibre 最近有几本epub格式的电子书要看发现电脑上没有可以打开的软件,所以最近找到了这个软件。功能 功能亮点电子书管理:Calib…

VS2022 C++QT 中文乱码 设置UTF-8编码

说明 所有内容来源于网络 通过插件调整源文件编码FileEncoding:查看编码 Force UTF-8:用于保存为UTF-8 C++项目设置为utf-8 项目-属性-配置属性-C/C++-命令行-其它选项 中 增加/utf-8、

雷池 WAF 配置了多条人机验证规则,命中规则是怎样的?

优先级说明 频率限制(1 小时) > 自定义规则(1 小时) > 站点 BOT 防护(自定义时长) 配置人机验证的地方 【防护配置-频率限制】限制结果选择【人机验证】【防护配置-自定义规则】规则类型选择【人机验证】【防护站点-站点管理】的【BOT 防护】中开启【人机验证】命中…

如何在C#.NET中使用LINX(arduino的LabView库)

思路:使用LabView的导出为.NET互操作程序集,导出COM给.NET调用在LabView安装HubMaker插件,将预编译固件刷入Arduino设备中。这不是本文的重点,省略 根据需要,编写VI。注意:必须在此处使用全局变量或者其它方法避免LinxResource簇在C#中出现,否则在程序运行时有概率出现堆…

C#.Net NModbus库 简单代码案例(非Nmodbus4库)

在NuGet管理器中搜索NModbus。注意,如果需要使用串口通信需要同时选中相关包

EyeSoothe荣登中国区“健康健美”类第32名! ✨

眼睛疲劳、视力变化、色盲检测、虚拟眼镜试戴……这些问题,EyeSoothe都能帮你解决!作为一款全能眼健康应用,EyeSoothe集成了多个强大功能,旨在帮助你更好地保护视力,缓解眼部疲劳,随时关注眼健康。📱💡 https://apps.apple.com/app/eyesoothe/id6478070048 为什么选择…

腾讯云 AI 代码助手:代码诊断应用实践

代码诊断是指通过分析和检查源代码,发现并定位其中的错误、缺陷或不规范之处。传统的代码诊断方法主要依赖于人工审查和简单的静态分析工具,结合流水线的自动化能力并且结合质量门禁建立不同的质量阈值关卡。基于 AI 赋能代码诊断是在传统的能力基础上在次进行质量左移,通过…

虚拟机下centos7系统实现修改ip地址为固定ip

修改虚拟机配置 目的 如果不修改虚拟机配置,会出现设置了静态IP和相关参数之后,本地局域网可以互相访问,但是CentOS系统访问不了互联网。 步骤一:以管理员身份打开虚拟机 步骤二:打开虚拟网络编辑器 左上角菜单栏找到“编辑”选项并单击,在下拉子菜单中单击选项“虚拟网络…

【每日一题】20241220

事情总是这样。一个人竭尽全力想要置身事外,但忽然有一天,不知道为什么,却发现自己身处某个故事之中,一路奔向结局。【每日一题】 1.(16分) \(\hspace{0.7cm}\)如图,\(ABD\) 为竖直平面内的光滑绝缘轨道,其中 \(AB\) 段是水平的,\(BD\) 段为半径 \(R=0.2 \; \mathrm{m…