這次帶給大家PHP內PDO事務使用步驟詳解,PHP內PDO事務使用的注意事項有哪些,下面就是實戰案例,一起來看一下。
概要:
將多條sql操作(增刪改)當作一個操作單元,要嘛都成功,要嘛都失敗。
單一資料不用交易處理
被操作的表格必須是innoDB類型的資料表(支援交易)
MySQL常用的表格類型:MyISAM(非交易)增刪改速度快、InnodB(事務型)安全性高
更改表格的類型為innoDB類型
mysql> alter table stu engine=innodb;
使用:
在PDO預處理的基礎上新增,如下格式:
try{ $m->beginTransaction();//开启事务处理 //PDO预处理以及执行语句... $m->commit();//提交事务 }catch(PDOException $e){ $m->rollBack();//事务回滚 //相关错误处理 }
範例:
$m = new PDO($dsn,$user,$pwd); $m->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); try{ $m->beginTransaction();//开启事务处理 $stmt=$m->prepare("insert into stu(name,sex,age,classid)values(?,?,?,?)"); $data=array( array("user1",1,22,"lamp76"), array("user2",1,20,"lamp76"), array("user3",0,22,"lamp76") ); foreach($data as $v){ $stmt->execute($v); echo $m->lastInsertId(); } $m->commit(); echo "提交成功!"; }catch(PDOException $e){ $m->rollBack();//回滚 die("提交失败!"); }
補充:再來一個php使用PDO的mysql事務處理與回滾操作實例分析
#概述:
事務(transaction)是由查詢和/或更新語句的序列組成。用 begin、start transaction
開始一個事務,rollback 回溯事務,commit 提交事務。在開始一個事務後,可以有若干個SQL 查詢或更新語句,每個SQL
遞交執行後,還應該有判斷是否正確執行的語句,以確定下一步是否回滾,若都被正確執行則最後提交事務。
交易一旦回滾,資料庫則保持開始交易前狀態。就好像一個被編輯的文件不存檔退出,自然還是保持文件原來的樣子。
所以,事務可被視為原子操作,事務中的 SQL,或全部執行,要不一句都不執行。
PHP中PDO的MYSQL事務處理步驟:
①.關閉自動提交
②.開啟事務處理
③ .有異常就自動拋出異常提示再回滾
④.開啟自動提交
注意:
mysql只有這個InnoDB驅動是支援事務處理的,預設MyIsAM驅動不支援.
#實例:
<?php try{ //最后是关闭自动提交 $pdo=new pdo("mysql:host=localhost;dbname=mydb","root","root", array(PDO::ATTR_AUTOCOMMIT=>0)); //这个是通过设置属性方法进行关闭自动提交和上面的功能一样 //$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0); //开启异常处理 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); }catch(PDOException $e){ echo "数据库连接失败:".$e->getMessage(); exit; } /* * 事务处理 * * 张三从李四那里买了一台 2000 元的电脑 * 从张三帐号中扣出 2000元 * 向李四账号中加入 2000元 * 从商品表中减少一台电脑 * MyIsAM InnoDB */ try{ $pdo->beginTransaction();//开启事务处理 $price=500; $sql="update zhanghao set price=price-{$price} where id=1"; $affected_rows=$pdo->exec($sql); if(!$affected_rows) throw new PDOException("张三转出失败");//那个错误抛出异常 $sql="update zhanghao set price=price+{$price} where id=3"; $affected_rows=$pdo->exec($sql); if(!$affected_rows) throw new PDOException("向李四转入失败"); echo "交易成功!"; $pdo->commit();//交易成功就提交 }catch(PDOException $e){ echo $e->getMessage(); $pdo->rollback(); } //自动提交,如果最后不自动提交,转账是不成功的 $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,1); //设置错误报告模式 ERRMODE_SILENT ERRMODE_WARNING
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀:
以上是PHP內PDO事務使用步驟詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!