PHP中PDO事务处理操作示例


Posted in PHP onMay 02, 2018

本文实例讲述了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 相关文章推荐
php基础知识:类与对象(1)
Dec 13 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
Jun 25 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
Aug 13 PHP
PHP中对缓冲区的控制实现代码
Sep 29 PHP
php批量添加数据与批量更新数据的实现方法
Dec 16 PHP
php读取mssql的ntext字段返回值为空的解决方法
Dec 30 PHP
分享常见的几种页面静态化的方法
Jan 08 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
May 26 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
Laravel利用gulp如何构建前端资源详解
Jun 03 PHP
PHP支付宝当面付2.0代码
Dec 21 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
Aug 17 PHP
PHP简单实现解析xml为数组的方法
May 02 #PHP
PHP实现动态压缩js与css文件的方法
May 02 #PHP
Yii2框架数据验证操作实例详解
May 02 #PHP
Yii2框架类自动加载机制实例分析
May 02 #PHP
PHP通过bypass disable functions执行系统命令的方法汇总
May 02 #PHP
购物车实现的几种方式优缺点对比
May 02 #PHP
PHP生成(支持多模板)二维码海报代码
Apr 30 #PHP
You might like
PHP从FLV文件获取视频预览图的方法
2015/03/12 PHP
php连接oracle数据库的方法(测试成功)
2016/05/26 PHP
thinkPHP实现多字段模糊匹配查询的方法
2016/12/01 PHP
javascript第一课
2007/02/27 Javascript
IE6与IE7中,innerHTML获取param的区别
2009/03/15 Javascript
javascript异步编程的4种方法
2014/02/19 Javascript
javascript调试之DOM断点调试法使用技巧分享
2014/04/15 Javascript
Jquery 全选反选实例代码
2015/11/19 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
浅谈如何实现easyui的datebox格式化
2016/06/12 Javascript
js canvas实现擦除动画
2016/07/16 Javascript
AngularJS表达式讲解及示例代码
2016/08/16 Javascript
AngularJS入门教程之多视图切换用法示例
2016/11/02 Javascript
Angular2环境搭建具体操作步骤(推荐)
2017/08/04 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
详解处理bootstrap4不支持远程静态框问题
2018/07/20 Javascript
基于Vue 服务端Cookies删除的问题
2018/09/21 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
React和Vue中监听变量变化的方法
2018/11/14 Javascript
layui表格内放置图片,并点击放大的实例
2019/09/10 Javascript
浅谈VUE中演示v-for为什么要加key
2020/01/16 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
微信小程序实现左滑删除效果
2020/11/18 Javascript
解决tensorflow模型参数保存和加载的问题
2018/07/26 Python
python 三元运算符使用解析
2019/09/16 Python
python判断正负数方式
2020/06/03 Python
Molly Bracken法国电子商店:法国女性时尚品牌
2019/07/24 全球购物
新奥尔良珠宝:Mignon Faget
2020/11/23 全球购物
JPA的特点
2014/10/25 面试题
市场营销职业生涯规划书范文
2014/01/12 职场文书
10的分与合教学反思
2014/04/30 职场文书
个人优缺点总结
2015/02/28 职场文书
简爱读书笔记
2015/06/26 职场文书
2015年迎新晚会策划书
2015/07/16 职场文书
办公室管理规章制度
2015/08/04 职场文书
nginx基于域名,端口,不同IP的虚拟主机设置的实现
2021/03/31 Servers