1 <meta http-equiv="Content-Type" content="text/html";charse="utf-8" />
2 <?php
3
4 /* 将一系列的更新操作放到beginTransaction()和commit()函数中调用,并通过try块执行,就可以保证在更改之前完成,其他人无法看到 */
5 $dsn = 'mysql:dbname=test;host=localhost';
6 $username = 'root';
7 $password = '';
8 $opt = array(PDO::ATTR_PERSISTENT => true);
9
10 //持续连接数据库
11 try{
12 $dbh = new PDO($dsn,$username,$password,$opt);
13 }catch(PDOException $e){
14 echo '数据库连接失败'.$e -> getMessage();
15 }
16
17 $dbh -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//设置PDO异常处理模式
18 $dbh -> setAttribute(PDO::ATTR_AUTOCOMMIT,0);//关闭自动提交
19
20 try{
21 $price = 80;
22 $dbh -> beginTransaction();//开始事备
23
24 $affected_row = $dbh -> exec("update account set cash = cash-{$price} where name='userA'");
25 if($affected_row > 0){
26 echo "userA成功转出{$price}元人民币<br>";
27 }else{
28 throw new PDOException('usrA转出失败');
29 }
30
31 $affected_row = $dbh -> exec("update account set cash = cash + {$price} where name='userB'");
32 if($affected_row > 0){
33 echo "userB成功转入{$price}元人民币<br>";
34 }else{
35 throw new PDOException('usrB转入成功');
36 }
37
38 echo '交易成功';
39 $dbh -> commit();//如果执行到此处说明两次语句执行成功,整个事务成功
40
41 }catch(PDOException $e){
42 echo "交易失败".$e -> getMessage();
43 $dbh -> rollback();//如果事务执行失败,回滚事务
44 }
45
46 $dbh -> setAttribute(PDO::ATTR_AUTOCOMMIT,1);//重新打开自动提交