举例说明MySQL中的事务
一.场景导入
现在有一张仓库表,仓库表中记录了每一个物品的数量,还有一张用户表,用户购买产品,仓库表的产品数量减少,而用户拥有产品的数量增加。
但是如果仓库中的产品数量不足时怎么处理?
例子:
#仓库表
create table if not exists Warehouse(
pro_id int primary key,
pro_name varchar(10),
pro_num int not null
); #用户表,用户表中的co_pro与仓库表中pro_id为外键关系
create table customer(
co_name varchar(10),
co_pro int ,
co_pro_num int default -1,
foreign key (co_pro) references warehouse(pro_id)
);
仓库表:
用户表:
创建一个购买的存储过程后:
#购买商品存储过程
delimiter //
create procedure buy(in buy_num int)
begin
#首先将仓库表中的数量减去
update warehouse set pro_num=pro_num-buy_num where pro_id = 100001;
#增加用户手里的商品数目
update customer set co_pro_num=co_pro_num+buy_num where co_pro=100001;
end
//
在表面上似乎没有问题,但是没有考虑到情况当我仓库中数目不足是怎么办?
例子:
call buy(11);

在这里巧克力数目出现了负数,那么这就是一个最基本的逻辑错误,想要避免这样的错误就可以使用事务的回滚。
二.什么是事务?
事务其实和存储过程、存储函数一样也是一个sql语句的聚合体。
在这个聚合体中也是执行某个操作,但是这个操作将是一个整体,如果单元中某一条语句执行失败了或者产生了错误,那么将会将整个单元回滚,此前的执行操作将全部取消,数据库将返回执行事务前的状态。
四.事务的四个特征
1.原子性
原子性理解就是:事务中的sql语句全部执行或者全部不执行。上面的例子中如果购买11个商品是不正确的那么用户也不会增加11个商品即增加的sql语句也不会执行即全部不执行,如果购买10个正确那么就可以执行增加数量的sql语句即全部执行。
2.一致性
一致性理解就是:无论这个事物是否成功还是失败,事务会使得数据库处于一致状态下,保持逻辑和数据的一致性。
比如说用户购买10个巧克力成功时那么用户的数据库中增加10个商品,而仓库中的数量减少10个,失败时回滚,回到购买前的数据状态。这样无论是在数据库在成功还是失败状态下,逻辑和数据都是一致性的。
3.隔离性
多个事务在执行时他们是不能相互干扰的。
4.永久性
如果一个事务提交,那么这个事务所造成的影响就就是永久的不可以在回滚的。
三.创建事务
3.1 MySQL中支持事务表的类型
在MySQL中支持事务表的类型有innoDB、BDB两种。所以在创建表时要选择表的类型。
3.2 创建一个事务
语法:start transaction; #初始化事务
事务主体
commit | rollback #提交事务或者回滚
下面我们将上一个存储过程加上一个事务:
#购买商品存储过程,使用事务
delimiter //
create procedure buy(in buy_num int)
begin
declare pro_ture_num int default -1;#局部变量获得减去后的数量
#首先将仓库表中的数量减去
start transaction;#开启事务
update warehouse set pro_num=pro_num-buy_num where pro_id = 100001;
set pro_ture_num=(select pro_num from warehouse where pro_id = 100001);
if pro_ture_num >=0 then
#增加用户手里的商品数目
update customer set co_pro_num=co_pro_num+buy_num where co_pro=100001;
else
rollback;
end if;
end
//
来调用一下这个有事务的存储过程:
测试1:
call buy(11);
结果:
测试2:
call buy(9);
结果
举例说明MySQL中的事务的更多相关文章
- 【MySQL】漫谈MySQL中的事务及其实现
最近一直在做订单类的项目,使用了事务.我们的数据库选用的是MySQL,存储引擎选用innoDB,innoDB对事务有着良好的支持.这篇文章我们一起来扒一扒事务相关的知识. 为什么要有事务? 事务广泛的 ...
- 漫谈MySql中的事务
最近一直在做订单类的项目,使用了事务.我们的数据库选用的是MySql,存储引擎选用innoDB,innoDB对事务有着良好的支持.这篇文章我们一起来扒一扒事务相关的知识. 为什么要有事务? 事务广泛的 ...
- (转)漫谈MySql中的事务
最近一直在做订单类的项目,使用了事务.我们的数据库选用的是MySql,存储引擎选用innoDB,innoDB对事务有着良好的支持.这篇文章我们一起来扒一扒事务相关的知识. 为什么要有事务? 事务广泛的 ...
- 【转】全面了解Mysql中的事务
为什么要有事务? 事务广泛的运用于订单系统.银行系统等多种场景.如果有以下一个场景:A用户和B用户是银行的储户.现在A要给B转账500元.那么需要做以下几件事: 1. 检查A的账户余额>500元 ...
- MySql中的事务嵌套
1.Mysql中的事务必须是InnoDB.Berkeley DB引擎,myisam不支持. 2.Mysql是不支持嵌套事务的,开启了一个事务的情况下,再开启一个事务,会隐式的提交上一个事务. 3.My ...
- MySQL中Procedure事务编写基础笔记
原文:MySQL中Procedure事务编写基础笔记 目录: 一.PROCEDURE: 二.CREATE PROCEDURE基本语法: 三.PROCEDURE小进阶 3.1.基本的DECLARE语 ...
- MySql中的事务、JDBC事务、事务隔离级别
一.MySql事务 之前在Oracle中已经学习过事务了,这个东西就是这个东西,但是在MySql中用法还是有一点不同,正好再次回顾一下. 先看看MySql中的事务,默认情况下,每执行一条SQL语句,都 ...
- 在MySQL中设置事务隔离级别有2种方法:
在MySQL中设置事务隔离级别有2种方法: 1 在my.cnf中设置,在mysqld选项中如下设置 [mysqld] transaction-isolation = READ-COMMITTED 2 ...
- 十:MYSQL中的事务
前言: 因为没有多少时间和精力,目前无法深入研究数据库中的事务,比如 但是,对于事务的一些基本知识,还是需要牢牢掌握的,做到了解事务的基本常识,在实际开发中能够理解各个持久层框架对事务的处理 一:是么 ...
随机推荐
- Caused by: java.io.FileNotFoundException: class path resource [spring/springmvc.xml] cannot be opene
Caused by: java.io.FileNotFoundException: class path resource [spring/springmvc. ...
- python3爆力破解rtsp脚本
一.说明 hydra是说已实现了rtsp的爆力破解,但是使用时发现字典中明明已包含正确的用户名密码hydra却还没检测出来: 拦截数据包查看,感觉hydra只是尝试去匿名访问,并没有发送用户名密码去验 ...
- Chargen UDP服务远程拒绝服务攻击漏洞修复教程
一.前置说明 chargen服务最初设计用于测试网络状态,监听19端口(包括TCP和UDP),其中UDP协议存在“Chargen UDP服务远程拒绝服务攻击漏洞”. chargen一般不会使用,所以直 ...
- Tomcat压缩传输设置
1.配置位于server.xml文件中的Connector节点下,具体参数如下: 参数 默认值 参数说明 compression off 是否开启压缩传输 compressableMimeType t ...
- html5游戏之Box2d物理引擎集成
前面两章我们已经研究了如何使用Box2d来模拟游戏世界,这一章就把所有的东西拼凑在一起,最终完成我们的游戏. 一.定义物体 典型的物体: {type:'ground',name:'dirt',x:50 ...
- flask项目结构(一)mariadb
简介: 本文主要是根据自己所学,创建一个flask项目,使用sqlalchemy,alembic,mariadb,bootstrap,APScheduler,selenium,request…………技 ...
- 离线安装docker镜像
假如由于网络原因,需要在一台无网络的电脑上运行镜像,那么docker是支持的. 你需要做的主要有3步骤: 1:先从一个有网络的电脑下载docker镜像 sudo docker pull ubuntu ...
- Hibernate多对多映射(双向关联)实例详解——真
一个学生可以选多门课 一门课程有多个学生上 实现步骤: 一.学生 (1)数据库创建学生数据表students,包含id,name字段 设置id字段为主键,类型:bigint,自增 设置name字段,类 ...
- ADO.NET 连接池 Session 状态分析
ADO.NET 中提供连接池避免 在业务操作中频繁打开,关闭连接. 当客户端释放连接后,连接池并未真正将数据库连接资源释放 , 而是根据连接字符串特征,将资源放到连接池中, 方便下次重用. 因此问题来 ...
- VSTO:使用C#开发Excel、Word【7】
第2章Office解决方案介绍 Office解决方案的三种基本模式现在,您了解Office对象模型的基本模式,本章将介绍开发人员如何模拟和构建其Offi ...