MySQL事务回滚

Posted 齐鲁师院网络安全社团

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL事务回滚相关的知识,希望对你有一定的参考价值。

mysql事务回滚


  最近学习MySQL学到了事务回滚,对其定义及利用有了一定的学习。

0 1

应用场景

事物回滚应用的场景还是比较多的,举个简单的例子:
我们银行ATM机进行取钱
1.输入密码,登录自己的账户
2.连接到后台数据库
3.获取账户余额
4.输入转账金额
5.后台数据库对金额进行减去操作
6.ATM吐出钱
这些步骤缺一不可,假如说在第五步中后台已经减去了金额但是ATM确没有吐出钱,那么这个取钱行为就不成立这个时候就需要数据库的事务回滚,即在整个过程中任意步骤出错整个事务就回滚回去



0 2

具体代码实现

下面代码简单模仿转账场景:

<?php //sql基本操作 /* * create table `pay`( * id int(10) not null, * name varchar(20) not null. * money float(5) not null * ); * insert pay (id,`name`,`money`) values(01,"alice","100"); insert pay (id,`name`,`money`) values(02,"bob","150"); insert pay (id,`name`,`money`) values(03,"coco","50"); */ //连接数据库 $link = new Mysqli("localhost","root","zhuangyan","test"); if ($link->connect_error) { exit($link->connect_error()); }else{ print "连接成功"; } if(isset($_POST["submit"])){ //关闭自动提交 $link->autocommit(FALSE); try{ $money = null; //查询用户余额 $sqls = "select money from `pay` where name = '{$_POST["name"]}'"; $res = $link->query($sqls); $money = $res->fetch_assoc()["money"]; //更新余额 $sqlt = "update `pay` set `money` =" . ($money-$_POST["money"]) ." where name = '{$_POST["name"]}'"; print ("您的余额为:".$money-$_POST["money"]); $link->query($sqlt); if($_POST["money"] > $money) { throw new Exception ("取钱失败"); }else{ print "取钱成功"; } //开启提交事务 $link->commit(); }catch(Exception $e){ print $e->getMessage(); $link->rollback(); } //开启自动提交数据库更改 $link->autocommit(true); } $link->close();  ?><!DOCTYPE html><html><head> <title>Pay</title></head><body> <form method="POST"> <input type="text" name="name"> <input type="number" name="money"> <input type="submit" name="submit" value="取钱"> </form></body></html>

在MySQL里面只有innodb支持事务回滚,这边可以自行搜索下MySQL的数据库引擎
因此需要在phpstudy中设置数据库引擎为innodb,之后重启mysql

如果上面这个方法不成功的话可以在建表的时候指定为innodb,如:

create table `pay`( id int(10) not null, name varchar(20) not null, money float(5) not null)type=innodb;

我这里是建表后意识到这个问题的,所以使用alter进行更新

alter table pay engine=InnoDB;


MySQL事务回滚

0 3

演示效果

表pay的最初状态

MySQL事务回滚

alice转账50元

MySQL事务回滚

alice继续转账100

MySQL事务回滚





新浪微博:齐鲁师范学院网络安全社团

以上是关于MySQL事务回滚的主要内容,如果未能解决你的问题,请参考以下文章

MySQL事务不回滚会有啥影响?

mysql事务回滚

mysql事务 - 回滚任何异常

MySQL事务回滚

MYSQL事务超全知识总结#yyds干货盘点#

对mysql事务提交回滚的错误理解