PHP で PDO トランザクションを使用する手順の詳細な説明

php中世界最好的语言
リリース: 2023-03-25 21:14:01
オリジナル
1589 人が閲覧しました

今回は、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 トランザクション処理手順:

①、自動送信をオフにする

③、例外が発生した場合は、自動的に

例外をスローする

プロンプトを表示してロールバックする

④. 自動送信をオンにします

注:

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+MySQLはメッセージキューを詳細に実装します

以上がPHP で PDO トランザクションを使用する手順の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート