入门PHP就来我这(高级)20 ~ 事务处理

有胆量你就来跟着路老师卷起来!-- 纯干货,技术知识分享

路老师给大家分享PHP语言的知识了,旨在想让大家入门PHP,并深入了解PHP语言。

接着上篇我们来看下PDO数据库的事务处理。

1 PDO中的事务处理

1.1 事务相关概念

事务(transaction)是由查询和更新语句的序列组成。用begin、start_transaction开始一个事务,rollback回滚事务,commit提交事务。在开始一个事务后,可以有若干个SQL查询或更新语句,每个SQL递交执行后,还应该有判断是否正确执行的语句,以确定下一步是否回滚,若都被正确执行则最后提交事务。事务一旦回滚,数据库则保持开始事务前的状态。所以事务可被称为原子操作,事务中的SQL要么全部执行,要么一句也不执行。可以理解为:一荣俱荣一损俱损

PDO中实现事务处理的方法如下:

  • 开启事务: beginTransaction()方法,该方法将关闭自动提交模式(autocommit),直到事务提交或者回滚后才恢复。
  • 提交事务: commit()方法,该方法完成事务的提交操作,成功则返回true,失败则返回false。
  • 事务回滚: rollback()方法,该方法执行事务的回滚操作。
1.2 事务案例

现有一个问答网站,路飞提出一个问题需要花费10个积分,娜美回答路飞一个问题,且被路飞采纳,则娜美活得10个积分,且两个事件应该同时完成。任何一个事件出错,则回滚到最初的状态。

创建数据库:

sql 复制代码
CREATE TABLE `member` (
  `id` INT ( 8 ) NOT NULL AUTO_INCREMENT,
  `nickname` VARCHAR ( 200 ) NOT NULL,
  `email` VARCHAR ( 200 ) DEFAULT NULL,
  `phone` VARCHAR ( 11 ) DEFAULT NULL,
  `level` CHAR ( 10 ) DEFAULT NULL,
  `credits` INT ( 10 ) NOT NULL DEFAULT '100' COMMENT '积分',
PRIMARY KEY ( `id` ) 
) ENGINE = MyISAM AUTO_INCREMENT = 5 DEFAULT CHARSET = utf8;

创建index.php文件

开启事务,执行事务,如果执行成功提示"操作成功",否则回滚到初始状态。index.php文件具体代码如下:

php 复制代码
<?php
    require "config.php";

    try{
        //实例化PDO对象,采用new的方式
        $pdo = new PDO(DB_DSN,DB_USER,DB_PWD);
        //关闭自动提交
        $options = array(PDO::ATTR_AUTOCOMMIT,0);
        //开启事务
        $pdo->beginTransaction();
        $sql='update member set credits = credits-10 where nickname="路飞"';
        $result1=$pdo->exec($sql);
        if($result1==0){
            throw new PDOException("路飞扣除积分失败");
        }
        $result2=$pdo->exec('update member set credits=credits+10 where nickname="娜美"');
        if($result2==0){
            throw new PDOException("娜美获取积分失败");
        }
        //提交事务
        $pdo->commit();
        echo "采纳成功!";
    } catch (PDOException $e) {
        echo 'sql语句异常:'.$sql."<br>";
        echo "Error:".$e->getMessahe()."<br>";
    }
    
    
    
?>

执行成功后:

下一篇 cookie与session

大家如果喜欢技术,并想有个好的交流平台可以关注我的 我的知乎首页,会不定期分享本人觉得比较好的技术类电子书。
另外,自己创建的一个技术qq群,玩转技术群,该群里功能:分享技能,电子书,源代码,以及兼职项目等交流,欢迎大家加入一起交流。
相关推荐
这个DBA有点耶1 天前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
这个DBA有点耶1 天前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技1 天前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend1 天前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
ClouGence1 天前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
先吃饱再说2 天前
存储的进化:从 MySQL 到浏览器缓存,数据到底住在哪?
数据库
Nturmoils2 天前
字段太多看不全,ksql 的展开模式和输出控制怎么用
数据库·后端
Databend2 天前
Agent 轨迹分析与归因的数据工程实践
大数据·数据库·agent
这个DBA有点耶2 天前
SQL改写进阶:标量子查询的“隐形代价”与消除实战
数据库·mysql·架构
smallyoung2 天前
数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南
数据库·mysql·postgresql