今回は、PHP で PDO トランザクションを使用する手順について詳しく説明します。PHP で PDO トランザクションを使用する際の 注意事項 は何ですか?実際のケースを見てみましょう。
概要:
複数の SQL 操作 (追加、削除、変更) を 1 つの操作単位として扱い、すべて成功するかすべて失敗します。 単一のデータにはトランザクション処理は必要ありません操作されるテーブルは 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("提交失败!"); }
補足: PDOを使用したmysqlトランザクション処理とロールバック操作の別のphpサンプル分析
概要:
トランザクションは、一連のクエリおよび/または更新ステートメントで構成されます。 トランザクションを開始するには begin、starttransaction を使用し、トランザクションをロールバックするには rollback を、トランザクションをコミットするには commit を使用します。 トランザクションの開始後、複数の SQL クエリまたは更新ステートメントが存在する可能性があります。各 SQL が実行のために送信された後、すべてが正しく実行された場合に、次のステップでロールバックするかどうかを決定するステートメントも必要です。正しく実行されれば、最終的に提出されます。
トランザクションがロールバックされると、データベースはトランザクションが開始される前の状態のままになります。編集したファイルを保存せずに終了した場合と同様に、ファイルの元の外観は自然に保持されます。
したがって、トランザクションはアトミックな操作とみなすことができ、トランザクション内の SQL は完全に実行されるか、まったく実行されないかのどちらかになります。 PHP での PDO の
①、自動送信をオフにする
③、例外が発生した場合は、自動的に
例外をスローするプロンプトを表示してロールバックする
注: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 中国語 Web サイトの他の関連記事にもご注目ください。 推奨読書:
phpはcurlを使用してIPをコピーし、詳細を参照します以上がPHP で PDO トランザクションを使用する手順の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。