事物处理

 1 <?php
 2     $pdo = new PDO("mysql:host=localhost;dbname=demo", "mysql_urer", "mysql_password");
 3     $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);  //设置异常处理模式
 4     $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);                   //关闭自动提交
 5 
 6     /* 使用异常处理试着去执行转账的事务,如果有异常转到catch区块中 */
 7     try {
 8         $price = 80;                //商品交易价格,也是转账金额
 9         $pdo->beginTransaction();   //开始事备
10 
11         $affected_rows = $pdo->exec("update account set cash=cash-{$price} where name='userA'"); //转出
12          
13         if($affected_rows > 0)
14             echo "userA成功转出{$price}元人民币<br>";
15         else
16             throw new PDOException('userA转出失败');      //失败抛出异常,不向下再执行,转到catch区块
17 
18         $affected_rows = $pdo->exec("update account set cash=cash+{$price} where name='userB'"); //转入
19     
20         if($affected_rows > 0)
21             echo "成功向userB转入{$price}元人民币<br>";
22         else
23             throw new PDOException('userB转入失败');      //失败抛出异常,不向下再执行,转到catch区块
24 
25         echo "交易成功!";
26         $pdo->commit();             //如果执行到此处表示前面两个查询执行成功,整个事务执行成功
27     }catch(PDOException $e){
28         echo "交易失败:".$e->getMessage();
29         $pdo->rollback();           //如果执行到此处理表示事务中的语句出问题了, 整个事务全部撤消
30     }
31 
32     $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);          //重新开启自动提交
33 
34     
35     

原文地址:https://www.cnblogs.com/qingxiaoping/p/5003345.html