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