事务:是一个整体,要么一起执行,要么一起回滚 事务的特性:原子性,一致性,隔离性,永久性 如要将多个SQL语句作为一个整体执行,就需要使用到事务 语法 - start transaction 或 begin 开启事务
- commit 提交事务
- rollback 回滚事务
复制代码例程 - //创建测试数据sql代码
- create table bank(
- cardid char(4) primary key comment '卡号',
- balance decimal(10,2) not null comment '余额'
- )engine=innodb charset=utf8 comment '银行卡号表'
- insert into bank values ('1001',1000),('1002',1)
复制代码PDO事务操作代码 - <body>
- <?php
- if(!empty($_POST)){
- $dsn='mysql:dbname=data;charset=utf8';
- $pdo=new PDO($dsn,'root','root');
- $out=$_POST['card_out']; //转出卡号
- $in=$_POST['card_in']; //注入卡号
- $money=$_POST['money']; //金额
- $pdo->beginTransaction(); //开启事务
- //转账
- $flag1=$pdo->exec("update bank set balance=balance-$money where cardid='$out'");
- $flag2=$pdo->exec("update bank set balance=balance+$money where cardid='$in'");
- //查看转出的账号是否大于0,大于0返回true,否则返回false
- $stmt=$pdo->query("select balance from bank where cardid='$out'");
- $flag3=$stmt->fetchColumn()>=0?1:0;
-
- if($flag1 && $flag2 && $flag3){
- $pdo->commit (); //提交事务
- echo '转账成功';
- }
- else{
- $pdo->rollBack (); //回滚事务
- echo '转账失败';
- }
- }
- ?>
- <form action="" method="post">
- 转出卡号: <input type="text" name="card_out" id=""> <br>
- 转入卡号: <input type="text" name="card_in" id=""> <br>
- 金额:<input type="text" name="money" id=""> <br>
- <input type="submit" value="提交">
- </form>
- </body>
复制代码
|