php中PDO操作事务

[复制链接]
查看1747 | 回复0 | 2020-11-5 13:41 | 显示全部楼层 |阅读模式
事务:是一个整体,要么一起执行,要么一起回滚
事务的特性:原子性,一致性,隔离性,永久性
需要将多个SQL语句作为一个整体执行,就需要使用到事务
语法
  1. start transaction 或 begin                开启事务
  2. commit        提交事务
  3. rollback        回滚事务
复制代码
例题
创建测试数据
  1. create table bank(
  2.        cardid char(4) primary key comment '卡号',
  3.        balance decimal(10,2) not null comment '余额'
  4. )engine=innodb charset=utf8 comment '银行卡号表'

  5. insert into bank values ('1001',1000),('1002',1)
复制代码
PDO操作事务
  1. <body>
  2. <?php
  3. if(!empty($_POST)){
  4.     $dsn='mysql:dbname=data;charset=utf8';
  5.     $pdo=new PDO($dsn,'root','root');
  6.     $out=$_POST['card_out'];    //转出卡号
  7.     $in=$_POST['card_in'];      //注入卡号
  8.     $money=$_POST['money'];     //金额
  9.     $pdo->beginTransaction();   //开启事务
  10.     //转账
  11.     $flag1=$pdo->exec("update bank set balance=balance-$money where cardid='$out'");
  12.     $flag2=$pdo->exec("update bank set balance=balance+$money where cardid='$in'");
  13.     //查看转出的账号是否大于0,大于0返回true,否则返回false
  14.     $stmt=$pdo->query("select balance from bank where cardid='$out'");
  15.     $flag3=$stmt->fetchColumn()>=0?1:0;
  16.    
  17.     if($flag1 && $flag2 && $flag3){
  18.         $pdo->commit ();    //提交事务
  19.         echo '转账成功';
  20.     }
  21.     else{
  22.         $pdo->rollBack ();  //回滚事务
  23.         echo '转账失败';
  24.     }
  25. }
  26. ?>
  27. <form action="" method="post">
  28.     转出卡号: <input type="text" name="card_out" id=""> <br>
  29.     转入卡号: <input type="text" name="card_in" id=""> <br>
  30.     金额:<input type="text" name="money" id=""> <br>
  31.     <input type="submit" value="提交">
  32. </form>
  33. </body>
复制代码
小结:
$pdo->beginTransaction()        开启事务 $pdo->commit ()                        提交事务 $pdo->rollBack()                        回滚事务
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

UID
1
贡献
387
丢币
38902
主题
4607
回帖
116
注册时间
2018-9-25
最后登录
2024-4-30