MySQL (八)-- 事务、变量、触发器
1 事务
- 需求:有一张银行账户表,A用户给B用户转账,A账户先减少,B账户增加,但是A操作完之后断电了。
- 解决方案:A减少钱,但是不要立即修改数据表,B收到钱之后,同时修改数据表。
- 事务:一系列要发生的连续的操作。
- 事务安全:一种保护连续操作同时满足(实现)的机制,事务安全的意义:保证数据操作的完成性。
- 示例SQL脚本
-- 创建一个账户表
CREATE TABLE my_account(
id int primary key auto_increment,
) NOT NULL COMMENT '账户',
NAME ) NOT NULL COMMENT '姓名',
,) DEFAULT 0.0 COMMENT '账户余额'
);
-- 插入数据
);
);

-- 张三转账 WHERE NAME = '张三';

- 张三一转完钱,就退出了系统,然后,可怕的是,李四没有收到,那么张三就少了这1000元,很可怕,如果天下银行都这么办,估计银行早就倒闭了。那怎么办,那就是要进行事务操作。
1.1 事务操作
- 事务操作有两种:自动事务(默认的)和手动事务。
- 手动事务:操作流程
- ①开启事务(start transaction):告诉系统以下所有的操作(写)不要直接写入到数据库,先存放到事务日志。


- ②进行事务操作:一系列的操作(李四借钱给张三)。
- 李四账户减少
- ②进行事务操作:一系列的操作(李四借钱给张三)。
-- 事务操作:1李四账户减少1000 WHERE NAME = '李四';

SELECT * FROM my_account;

我们在开启一个客户端,会发现如下的状况。

- 张三账户增加
-- 事务操纵:2张三账户增加1000 WHERE NAME = '张三'; SELECT * FROM my_account;
我们如果再开启一个客户端,会发生如下状况

- 关闭事务:选择性的将事务日志文件中的操作结果保存到数据表(同步)或直接清空事务日志(原来的操作全部清空)。
- 提交事务(commit):同步数据表(操作成功)
- 关闭事务:选择性的将事务日志文件中的操作结果保存到数据表(同步)或直接清空事务日志(原来的操作全部清空)。
-- 提交事务 COMMIT;
当提交完事务的时候,我们会发现再开启一个客户端,两边的数据是一样的。

- 回滚事务(rollback):直接清空日志表(操作失败)
1.2 事务原理
- 事务操作原理:事务开启之后,所有的操作都会临时保存到事务日志,事务日志只有在得到commit命令才会同步到数据库表,其它任何情况都会清空事务日志(rollback,断电,断开连接)。

1.3 回滚点
- 回滚点:在某个成功的操作完成之后,后续的操作有可能成功或失败,但是不管成功还是失败,前面的操作都已经成功;那么就可以在当前成功的位置,设置一个点,供后续失败操作返回到该位置,而不是返回所有操作,这个点就是回滚点。
- 设置回滚点:savepoint 回滚点名字。
- 回到回滚点:rollback to 回滚点名字。
-- 开启事务 START TRANSACTION; -- 事务处理1:张三发工资 WHERE NAME = '张三'; -- 设置回滚点 SAVEPOINT sp1; -- 银行扣税 * 0.5 WHERE NAME = '李四'; -- 回滚到回滚点 ROLLBACK TO sp1; -- 继续给张三扣税 * 0.5 WHERE NAME = '张三'; -- 事务提交 COMMIT;
1.4 自动事务
- 在MySQL中:默认的都是自动事务处理,用户操作完全会立即同步到数据表中。
- 自动事务:系统通过autocommit的变量控制。
SHOW VARIABLES LIKE 'autocommit';

- 关闭自动事务:set autocommit = off;
SET autocommit = off;

- 再次开启自动事务:set autocommit = on;

1.5 事务的特定(ACID)
- 事务有四大特性:ACID
- ①A:atomic,原子性,事务的整体是一个操作,不可分割,要么全部成功,要么全部失败。
- ②C:consistency,一致性,事务操作的前后,事务表中的数据没有变化。
- ③I:isolation,隔离性,事务操作是相互隔离不受影响的。
- ④D:durability,持久性,数据一旦提交,不可该表,永久的改变数据表数据。
- 锁机制:innodb默认是行锁,但是如果在事务操作的过程中,没有使用到索引,那么系统会自动全表检索数据,自动升级为表锁。
- 行锁:只有当前行被锁住,别的用户不能操作。
- 表锁:整张表被锁住,别的用户不能操作。
2 变量
- 变量分为两种:系统变量和自定义变量。
2.1 系统变量
- 系统变量:系统定义好的变量,大部分的时候用户根本不需要使用系统变量,系统变量是用来控制服务器的表现的,如autocommit等。
- 查看系统变量
-- 查看所有系统变量 SHOW VARIABLES;
- 查看具体的系统变量的值:select @@系统变量名;
select @@version,@@autocommit;

- 修改系统变量
- 修改系统变量分为两种:会话级别和全局级别
- 会话级别:临时修改,当前客户端当次连接有效。
- 修改系统变量分为两种:会话级别和全局级别
set 变量 = 值;
- 全局级别:一个修改,永久生效(多所有客户端都生效)
set global 变量名 = 值;
2.2 自定义变量
- 定义变量:
- 系统为了区别是系统变量还是自定义变量,规定自定义变量前面必须加@
set @变量 = 值;
- 查看自定义变量
slect @变量;
- 在MySQL中,"="会默认的当做比较符号处理(很多地方),MySQL为了区分比较还是赋值的概念,重新定义了一个新的赋值符号: :=。当然,这个符号一般在SQL编程中使用。
- MySQL允许从数据表中获取数据,然后赋值给变量,有两种方式。
- ①边赋值,边查看结果
select @变量名 := 字段名 from 数据源;-- 从字段中取值赋给变量名
- ②只有赋值,没有结果,要求严格:数据记录最多只允许获取一条,MySQL不支持数组。
select 字段名 from 数据源 [where 条件] into 变量列表
INTO @name; SELECT @name;

- 所有自定义变量都是会话级别:当前客户端当次连接有效。
3 触发器
- 触发器:trigger,事先为某张表绑定好一段代码,当表中的某些内容发生改变的时候(增、删、改),系统会自动触发代码,执行。
- 触犯器:事件类型、触发时间、触发对象。
- 事件类型:增、删、改。
- 触发时间:前后,before和after。
- 触发对象:表中的每一条记录,针对行的。
- 一张表中只能有一种触发时间的一种类型的触发器,最多一张表有6个触发器。
3.1 创建触发器
- 触发器基本语法:
-- 临时修改语句结束符 DELIMITER 自定义符号:后续代码中只有碰到自定义符号才算结束 CREATE TRIGGER 触发器名字 触发时间 事件类型 ON 表名 FOR EACH ROW BEGIN -- 代表左大括号 开始 -- 里面就是触发器的内容:每行内容都必须使用;结束 END -- 代表右大括号 结束 -- 语句结束符 自定义符号 -- 将邻水修改修正过来 DELIMITER ;
- 示例脚本:
CREATE TABLE goods(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME ) NOT NULL,
price ,) ,
inv INT COMMENT '库存数量'
);
,);
,);
CREATE TABLE `order`(
id INT PRIMARY KEY AUTO_INCREMENT,
g_id INT NOT NULL COMMENT '商品id',
g_number INT COMMENT '商品数量'
);
- 创建触发器
-- 触发器:订单生成一个,商品库存减少一个
-- 临时修改语句结束符
DELIMITER /
CREATE TRIGGER after_order AFTER INSERT ON `order` FOR EACH ROW
BEGIN
;
END
-- 结束触发器
/
-- 修改临时语句结束符 DELIMITER ;

3.2 查看触发器
- 查看所有触发器或者模糊匹配
show triggers like 'pattern';


- 查看触发器创建语句
show create trigger after_order;

- 所有的触发器都会保存在information_schema.triggers表中。

3.3 使用触发器
- 触发器:不需要手动调用,当某种情况发生的时候会自动触发。
- 插入订单
SELECT * FROM goods;

,);
SELECT * FROM goods;

- ①触犯器的确工作了:订单生成了后,对应的商品表的商品数量减少了。②当前商品减少了,并不是订单中产生的商品;而是固定死的商品(触发器不合适)。
3.4 修改触发器&删除触发器
- 触发器不能被修改,只能先删除,再新增新的触发器。
drop trigger 触发器名字;
3.5 触发器记录
- 触发器记录:不管触发器是否触发了,只要当某种操作准备执行,系统就会将当前要操作记录的当前状态和即将执行之后新的状态给分别保留下来,供触发器使用。其中,要操作当前状态保存到old中,操作之后的可能状态保存给new。

- old代表的是旧记录,new代表的是新记录。
- 删除的时候是没有new的,而插入的时候是没有old的。
- old和new都是代表记录本身:任何一条记录除了有数据,还有字段名称
- 使用方式:old.字段/new.字段。
DELIMITER $$
CREATE
TRIGGER `after_order` AFTER INSERT ON `order`
FOR EACH ROW BEGIN
UPDATE goods SET inv = inv -new.g_number WHERE id = new.g_id;
END;
$$
DELIMITER ;
SELECT * FROM goods;

,);

- 如果触发器内部只有一条要执行的SQL指令,可以省略begin和end。
- 触发器:可以很好的协调表内部的数据处理顺序和关系,但是从java的角度出发,触发器会增加数据库维护的难度,所以较少使用触发器。
MySQL (八)-- 事务、变量、触发器的更多相关文章
- MySQL八:视图、触发器、事物、存储过程、函数
阅读目录 一 视图 二 触发器 三 事务 四 储存过程 五 函数 六 流程控制 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名 ...
- 数据库MySQL之 视图、触发器、存储过程、函数、事务、数据库锁、数据库备份、事件
数据库MySQL之 视图.触发器.存储过程.函数.事务.数据库锁.数据库备份.事件 浏览目录 视图 触发器 存储过程 函数 事务 数据库锁 数据库备份 事件 一.视图 1.视图概念 视图是一个虚拟表, ...
- MySQL之视图、触发器、事务、存储、函数、流程控制
一.视图 视图就是一个虚拟表,我们把复杂的sql语句后看到的虚拟表封装起来,给他取个名字,当我们下次使用的时候,就不用再去写复杂的sql语句,直接调用封装后的视图名字,就可以得到我们想要的表,然后就可 ...
- MySQL之视图、触发器、事务、存储过程、函数 流程控制
MySQL之视图.触发器.事务.存储过程.函数 阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 MySQL这个软件想将数据处理的所有事情,能够在mysql这个层面上全部 ...
- MySQL之试图、触发器、事务、存储过程、函数
阅读目录 一.视图 二.触发器 三.事务 四.存储过程 五.函数 六.流程控制 一.视图 视图是一个虚拟表(非真实存在),是跑到内存中的表,真实表是硬盘上的表,怎么就得到了虚拟表,就是你查询的结果,只 ...
- day 40 MySQL之视图、触发器、事务、存储过程、函数
MySQL之视图.触发器.事务.存储过程.函数 阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 MySQL这个软件想将数据处理的所有事情,能够在mysql这个层面上 ...
- MySQL 的视图、触发器、事务、存储过程、函数
MySQL 的视图.触发器.事务.存储过程.函数 阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句 ...
- Mysql学习笔记(八)由触发器回顾外键约束中的级联选项
近些天都没有写博客.在学习mysql的知识,通过学习和练习,也熟悉了mysql的函数.触发器.视图和存储过程.并且在实际的开发过程中也应用了一小部分.效果还是十分理想的. 今天晚上在学习触发器模仿in ...
- mysql第五篇 : MySQL 之 视图、触发器、存储过程、函数、事物与数据库锁
第五篇 : MySQL 之 视图.触发器.存储过程.函数.事物与数据库锁 一.视图 视图是一个虚拟表(非真实存在的),其本质是‘根据SQL语句获取动态的数据集,并为其命名‘ ,用户使用时只需使用“名称 ...
- MySQL的事务
MySQL的事务 1.事务:事务是由一步或者几步数据库操作序列组成的逻辑执行单元,这一系列操作要么全部执行,要么全部放弃执行. 2.事务具备的四个特性(简称为ACID性): (1)原子性(Atomic ...
随机推荐
- java自学找工作经历
断断续续的,折腾了7个多月,学完了在网上购买的培训机构J2EE的全套课程.期间各种蛋疼看另一篇博客 http://www.cnblogs.com/work396/p/6791488.html 直接说找 ...
- 在实际项目中使用LiteDB NoSQL数据库
LiteDB 是一个 NoSQL 数据库,特点是 MongoDB like 和 0 配置.100% 原汁原味的 C# 开发, Release 只有一个 DLL,官方有一下适用场景:移动App,桌面小应 ...
- Mook第八周习题 单词长度(4分)(1)题
题目内容: 你的程序要读入一行文本,其中以空格分隔为若干个单词,以'.'结束.你要输出这行文本中每个单词的长度.这里的单词与语言无关,可以包括各种符号,比如"it's"算一个单词, ...
- Java-将多线程停止的两种方法
线程如何停止呢 stop方法过时了,看起描述发现,有其他解决方案. 线程结束:就是让线程任务代码执行完,run方法结束. run方法怎么结束呢? run方法中通常都定义循环,只要控制住循环就哦了. / ...
- Thinkphp5 实现悲观锁
悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态.悲观锁的实现,往往依 ...
- ThinkSNS+ alpha.2 版本发布,功能抢先看!【社交系统研发日记六】
今天的研发日记,我们不讲技术,我们来看看,社交系统TS+从今天开始全面内测开始,都发布了什么功能. 其实,alpha.1 早上打的 tag ,晚上因为增加了两个核心功能,所以又打了 alpha.2 t ...
- oracle 11gR2 RAC安装手册
--oracle 11gR2 RAC安装手册 -----------------------------2013/10/29 参考三思笔记 http://files.cnblogs.com/jackh ...
- HTML-移动开发技巧 响应式布局 弹性布局
移动开发常用技巧 [viewport基本知识] 设置布局viewpoint的各种信息 1.width=device-width;设置viewport视口宽度等于设备宽度 2.initial-scale ...
- iOS蓝牙BLE开发
蓝牙是一个标准的无线通讯协议,具有设备成本低.传输距离近和功耗低等特点,被广泛的应用在多种场合.蓝牙一般分为传统蓝牙和BLE两种模式:传统蓝牙可以传输音频等较大数据量,距离近.功耗相对大:而BLE则用 ...
- C进阶—详解编译、链接
被隐藏了的过程 现如今在流行的集成开发环境下我们很少需要关注编译和链接的过程,而隐藏在程序运行期间的过程可不简单,即使使用命令行来编译一个源代码文件,简单的一句"gcc hello.c ...