码迷,mamicode.com
首页 > 数据库 > 详细

举例说明MySQL中的事务

时间:2018-09-28 20:34:13      阅读:737      评论:0      收藏:0      [点我收藏+]

标签:mysq   inf   inno   div   使用   不可   commit   roc   技术   

一.场景导入

现在有一张仓库表,仓库表中记录了每一个物品的数量,还有一张用户表,用户购买产品,仓库表的产品数量减少,而用户拥有产品的数量增加。

但是如果仓库中的产品数量不足时怎么处理?

 例子:

#仓库表
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中支持事务表的类型有innoDBBDB两种。所以在创建表时要选择表的类型。

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中的事务

标签:mysq   inf   inno   div   使用   不可   commit   roc   技术   

原文地址:https://www.cnblogs.com/SAM-CJM/p/9720325.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!