PHP操作MySQL事务实例


Posted in PHP onNovember 05, 2014

本文实例讲述了PHP操作MySQL事务的方法,分享给大家供大家参考。具体方法如下:

一般来说,事务都应该具备ACID特征。所谓ACID是Atomic(原子性),Consistent(一致性),Isolated(隔离性),Durable(持续性)四个词的首字母所写,下面以“银行转帐”为例来分别说明一下它们的含义:

① 原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。换句话说,事务是不可分割的最小单元。比如:银行转帐过程中,必须同时从一个帐户减去转帐金额,并加到另一个帐户中,只改变一个帐户是不合理的。
② 一致性:在事务处理执行前后,数据库是一致的。也就是说,事务应该正确的转换系统状态。比如:银行转帐过程中,要么转帐金额从一个帐户转入另一个帐户,要么两个帐户都不变,没有其他的情况。
③ 隔离性:一个事务处理对另一个事务处理没有影响。就是说任何事务都不可能看到一个处在不完整状态下的事务。比如说,银行转帐过程中,在转帐事务没有提交之前,另一个转帐事务只能处于等待状态。
④ 持续性:事务处理的效果能够被永久保存下来。反过来说,事务应当能够承受所有的失败,包括服务器、进程、通信以及媒体失败等等。比如:银行转帐过程中,转帐后帐户的状态要能被保存下来。

在PHP中,mysqli 已经很好的封装了mysql事务的相关操作。如下示例:

$sql1 = "update User set ScoreCount = ScoreCount +10 where ID= '123456'";

$sql2 = "update ScoreDetail  set FScore = 300 where ID= '123456'";

$sql3 = "insert into  ScoreDetail ID,Score) values ('123456',60)";

$mysqli = new mysqli('localhost','root','','DB_Lib2Test');

$mysqli->autocommit(false);//开始事物

$mysqli->query($sql1);

$mysqli->query($sql2);

if(!$mysqli->errno){

  $mysqli->commit();

  echo 'ok';

}else{

 echo 'err';

  $mysqli->rollback();

}

在这里,我们再使用 php mysql 系列函数执行事务。
$sql1 = "update User set ScoreCount = ScoreCount +10 where ID= '123456'";

$sql2 = "update ScoreDetail  set FScore = 300 where ID= '123456'";

$sql3 = "insert into  ScoreDetail ID,Score) values ('123456',60)";

$conn = mysql_connect('localhost','root','');

mysql_select_db('DB_Lib2Test');

mysql_query('start transaction');

//mysql_query('SET autocommit=0');

mysql_query($sql1);

mysql_query($sql2);

if(mysql_errno ()){

    mysql_query('rollback');

    echo 'err';

}else{

    mysql_query('commit');

    echo 'ok';

}

// mysql_query('SET autocommit=1');

// mysql_query($sql3);

在这里要注意:

MyISAM:不支持事务,用于只读程序提高性能
InnoDB:支持ACID事务、行级锁、并发
Berkeley DB:支持事务

希望本文所述对大家的PHP+MySQL数据库程序设计有所帮助。

PHP 相关文章推荐
在PHP中实现Javascript的escape()函数代码
Aug 08 PHP
使ecshop模板中可引用常量的实现方法
Jun 02 PHP
php中通过curl smtp发送邮件
Jun 05 PHP
php学习之function的用法
Jul 14 PHP
限制ckeditor上传图片文件大小的方法
Nov 15 PHP
php+ajax实时刷新简单实例
Feb 25 PHP
php+ajax无刷新分页实例详解
Dec 07 PHP
thinkphp3.2点击刷新生成验证码
Feb 16 PHP
php文件缓存方法总结
Mar 16 PHP
Yii2前后台分离及migrate使用(七)
May 04 PHP
详解PHP实现定时任务的五种方法
Jul 25 PHP
php源码 fsockopen获取网页内容实例详解
Sep 24 PHP
PHP通过插入mysql数据来实现多机互锁实例
Nov 05 #PHP
PHP中使用虚代理实现延迟加载技术
Nov 05 #PHP
PHP实现获取域名的方法小结
Nov 05 #PHP
php调用shell的方法
Nov 05 #PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
Nov 05 #PHP
ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
Nov 05 #PHP
phpnow php探针环境检测代码
Nov 04 #PHP
You might like
php+mysql事务rollback&commit示例
2010/02/08 PHP
php的urlencode()URL编码函数浅析
2011/08/09 PHP
PHP Static延迟静态绑定用法分析
2016/03/16 PHP
基于Jquery制作的幻灯片图集效果打包下载
2011/02/12 Javascript
关于jquery性能最佳实践的讨论,与求教
2012/03/30 Javascript
jQuery.holdReady()使用方法
2014/05/20 Javascript
JS不用正则验证输入的字符串是否为空(包含空格)的实现代码
2016/06/14 Javascript
jQuery 判断是否包含在数组中Array[]的方法
2016/08/03 Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
2016/12/16 Javascript
修改 bootstrap table 默认detailRow样式的实例代码
2017/07/21 Javascript
node.js中fs文件系统目录操作与文件信息操作
2018/02/24 Javascript
Vue2 监听属性改变watch的实例代码
2018/08/27 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
详解一个基于react+webpack的多页面应用配置
2019/01/21 Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
2019/05/05 Javascript
vue中使用[provide/inject]实现页面reload的方法
2019/09/30 Javascript
深入了解Vue动态组件和异步组件
2021/01/26 Vue.js
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
简单的Apache+FastCGI+Django配置指南
2015/07/22 Python
Python将多份excel表格整理成一份表格
2018/01/03 Python
PyCharm代码提示忽略大小写设置方法
2018/10/28 Python
pandas中apply和transform方法的性能比较及区别介绍
2018/10/30 Python
Python中list循环遍历删除数据的正确方法
2019/09/02 Python
python 负数取模运算实例
2020/06/03 Python
微软马来西亚官方网站:Microsoft马来西亚
2019/11/22 全球购物
毕业生机械建模求职信
2013/10/14 职场文书
网络教育自我鉴定
2014/02/04 职场文书
会计与审计专业自荐信范文
2014/03/15 职场文书
《独坐敬亭山》教学反思
2014/04/08 职场文书
银行自荐信范文
2015/03/25 职场文书
原告代理词范文
2015/05/25 职场文书
三好学生竞选稿范文
2019/08/21 职场文书
python 如何将两个实数矩阵合并为一个复数矩阵
2021/05/19 Python
详解Python生成器和基于生成器的协程
2021/06/03 Python
python blinker 信号库
2022/05/04 Python