MySQL数据库的触发器和事务
作者:面屏思过??????? 发布时间:2024-01-15 21:35:08
一、触发器
概念
触发器是SQL server提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,是由事件来触发。触发器经常用来加强数据的完整性约束和业务规则。
二、 触发器的操作
创建account和account_log数据表:
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
money DOUBL
);
INSERT INTO account VALUES (NULL,'张三',1000),(NULL,'李四',1000);
CREATE TABLE account_log(
id INT PRIMARY KEY AUTO_INCREMENT,
operation VARCHAR(20),
operation_time DATETIME,
operation_id INT,
operation_params VARCHAR(200)
);
触发器的增删改操作
// 语法格式: BEFORE|AFTER INSERT: 插入 UPDATE:更新 DELETE:删除
// DELIMITER $
// CREATE TRIGGER 触发器名称
// BEFORE|AFTER INSERT|UPDATE|DELETE
// ON 表名
// FOR EACH ROW
// BEGIN
// 触发器要执行的功能;
// END$
// DELIMITER ;
// 创建INSERT型触发器。用于对account表新增数据进行日志的记录
DELIMITER $
CREATE TRIGGER account_insert
AFTER INSERT
ON account
FOR EACH ROW
BEGIN
INSERT INTO account_log VALUES (NULL,'INSERT',NOW(),new.id,CONCAT('插入后{id=',new.id,',name=',new.name,',money=',new.money,'}'));
END $
DELIMITER ;
// 向account表添加一条记录
INSERT INTO account VALUES (NULL, '王五', 2000);
// 查询account表
SELECT * FROM account;
触发器的查看删除操作
// 查看标准语法: SHOW TRIGGERS;
// 查看触发器
SHOW TRIGGERS;
// 删除标准语法:DROP TRIGGER 触发器名称;
// 删除account_delete触发器
DROP TRIGGER account_delete;
三、事务
概念
在关系数据库中,一个事务可以是一个SQL语句,一组SQL语句或整个程序。其特点是这个单元要么同时成功要么同时失败,单元中的每条 SQL 语句都相互依赖,形成一个整体。事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
四大特性:
原子性:一个事务是一个不可分割的工作单位,事务包含的所有操作要么全部成功,要么全部失败回滚。
一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
隔离性: 当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离
持久性: 一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
四、事务的操作
基本流程
开启事务:记录回滚点,并通知服务器
执行SQL语句:执行具体的一条或多条sql语句
结束事务(提交|回滚):提交:没出现问题,数据进行更新;回滚:出现问题,数据恢复到开启事务时的状态
基础操作
-- 开启事务
START TRANSACTION;
-- 执行SQL语句
UPDATE account SET money=money-500 WHERE NAME='张三';
-- 回滚事务(出现问题)
ROLLBACK;
-- 提交事务(没出现问题)
COMMIT;
事务的提交方式
// 查看提交方式
SELECT @@AUTOCOMMIT; -- 1代表自动提交 0代表手动提交
// 修改事务的提交方式
SET @@autocommit=1;
事务的隔离级别
四种隔离级别
读未提交:read uncommitted
读已提交:read committed (Oracle/SQL Server 数据库默认级别)
可重复读:repeatable read (MySQL 默认级别)
串行化:serializable
可能引发问题:
脏读:是指在一个事务处理过程中读取了另一个未提交的事务中的数据 , 导致两次查询结果不一致
不可重复读:是指在一个事务处理过程中读取了另一个事务中修改并已提交的数据, 导致两次查询结果不一致
幻读:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入。或不存在执行delete删除,却发现删除成功
隔离操作
// 查询数据库隔离级别
SELECT @@TX_ISOLATION;
// 修改数据库隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL 级别字符串;
注意:隔离级别从小到大安全性越来越高,但是效率越来越低 , 所以不建议使用READ UNCOMMITTED 和 SERIALIZABLE 隔离级别.
来源:https://juejin.cn/post/7126937053975019534
猜你喜欢
- 直方图的定义直方图的性质只统计某个灰度级出现的次数,图像的大小不一样的话, 某灰度值的像素出现的次数是不一样的。那如果我们在这基础上除以像素
- keras中正则化(regularization)keras内置3种正则化方法keras.regularizers.l1(lambda)ke
- 下面先给大家介绍下Python 3 判断2个字典相同的方法,Python自带的数据结构dict非常好用,之前不知道怎么比较2个字典是否相同,
- max_redis.php<?phpset_time_limit (0);for($i=1;$i<=1050;$i++){exe
- 老婆大人让俺帮她通过Excel生成百人的准考证,她们学校打算来一次高考模拟。由于高考改革,每个学生的考试科目不一样,需要自动生成一下。我一个
- 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法
- 一、实现过程本文对经典手写数字数据集进行多分类,损失函数采用交叉熵,激活函数采用ReLU,优化器采用带有动量的mini-batchSGD算法
- 1 简介DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表。或许说它可能有点像matlab的矩
- 这里再重复一下标题为什么是"使用"而不是"实现":首先,专业人士提供的算法比我们自己写的算法无论是效
- 本文实例讲述了Python去除列表中重复元素的方法。分享给大家供大家参考。具体如下:比较容易记忆的是用内置的setl1 = ['b&
- Python转json时出现中文乱码设置报文头# -*- coding:gbk -*- 连接数据库设置编码mysql = MyS
- 1.php in_array方法说明PHP查找数组元素是否存在,一般会使用in_array方法。bool in_array ( mixed
- 我们使用编辑器的时候,想要在其中添加一个Django项目,这样就能在里面做一些想要的操作。有些人还没有对Django进行安装,这里直接用命令
- 今天给大家推荐一款很好用的Python编辑器,全世界90%Python开发者都会用的开发工具------Pycharm,完全免费哦1. 百度
- 简述从官网下载了Python3.7.4,直接编译安装后,使用pip3出现了报错信息: Can't connect to HTTPS
- 应用程序慢如牛,原因多多,可能是网络的原因、可能是系统架构的原因,还有可能是数据库的原因。那么如何提高数据库SQL语句执行速度呢?有人会说性
- 前言推导式提供了更简洁高效的方法来生成序列而又不失代码的可读性。定义: 推导式是 Python 里很有用的一个特性,它可以用一行代码就可以创
- 1 介绍在设计到数据库的开发中,难免要将图片或音频文件插入到数据库中的情况。一般来说,我们可以同过插入图片文件相应的存储位置,而不是文件本身
- 目录1.引言2.获取目标网站3.爬取目标网站4.解析爬取内容4.1. 解析全国今日总况4.2. 解析全国各省份疫情情况4.3. 解析江苏各地
- 前言:分区是一种表的设计模式,正确的分区可以极大地提升数据库的查询效率,完成更高质量的SQL编程。但是如果错误地使用分区,那么分区可能带来毁