当前位置:主页 > PHP开发 > pdo >

PDO事务处理详解教程

栏目:pdo 来源: 微信小程序开发网 阅读: 2016-12-12
  什么是事务处理?先来看一个例子,假设小明购买了一台电脑他要转账给商家,如果没有事务处理的话,本来电脑3000一台,结果他不小心输入了30000万元,点一下转账结果一下子转到商家去了,这是非常危险的。如果有这样的功能就是在小明填写完3000元后,点转账后而有一个提示让我们再次确认是不是3000元,这样就不会出现上面出现的问题了。

  当小明确认是正确的金钱数,点确认转账给对方,如果不对可以修改或是取消交易不买了,这样就非常安全,不至少输入错了或是无法取消交易。

  通过上面的实例我们可以看出,当小明输入3000元后,并没有立马打到商家账号上面,而是让小明确认后再打开对方,或是有一个取消按扭直接取消交易。

  上面的过程就是事务处理,事务处理就是一系列的操作,目的是为了更好的处理比较敏感的数据。


pdo事务处理步骤

  上面只是举了一个简单的例子,通过pdo让我们看看事务处理的具体过程,在以后的编写项目中可能要用到事务处理,特别是处理“钱”时事务处理非常有帮助。

  1)关闭自动提交:

  $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);

  在处理个体业务逻辑时比如转账汇款,首先,要把自动提交关闭,等处理完业务逻辑(例如,转账)后,再提交处理,最后,再打开自动提交,因为有可能处理完这个业务逻辑转账汇钱,而后面的代码功能并不需要关闭自动提交功能,所以,最后要打开自动提交。

  2)处理业务逻辑:

  要处理业务逻辑先打开一个事务:
$pdo->beginTransaction();


  3)提交操作:
$pdo->commit();


  当上面处理的业务逻辑例如转账汇款后,就要提交操作,这个相当于上面的小明核对金额无误后,点确认的功能。

  4)若上面有问题或不想交易了则进行回滚:
$pdo->rollback();

  如果上面的业务逻辑出问题,则进行回滚操作,所谓回滚类似上面例子中小明买电脑转长时的“取消”操作。

  5)打开自动提交: 
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,1);


举例

  以小明买电脑为例子,所有代码如下所示:

<?php

try {

    $pdo = new PDO("mysql:host=localhost;dbname=dedecmsv57utf8sp1", "root", "123456");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);

} catch (PDOException $e) {

    echo "数据库连接失败".$e->getMessage();
    exit;
    
}

try {
    
     //开启事务
    $pdo->beginTransaction();

    $price = 3000;
    //小明转出3000元
    $affected_rows = $pdo->exec("UPDATE `dede_archives` SET money=money-{$price} WHERE id=1");
     
    //异常处理
    if($affected_rows>0){

        echo "转出成功";
        }else{
        throw new PDOException("转出失败");
        
        }
        
    //商家www.phpos.net收到3000元
    $affected_rows2 = $pdo->exec("UPDATE `dede_archives` SET money=money+{$price} WHERE id=2 ");

    //异常处理
    if($affected_rows2>0){
        ehco "成功收到";
    }else{

        throw new PDOException("收钱失败");
    }

  $pdo->commite();

} catch (PDOException $e) {

    echo '错误:'.$e->getMessage();
    //回滚取消所有操作
    $pdo->rollback();
}

$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);


  请注意加红的代码,上面只是给出一个演示实例,具体的项目里面的事务处理要比这个复杂的多,但是,无论怎么复杂具体的流程都是一样的。

  另外上面的代码的结构是:

  1)关闭自动提交在第一个try里面。

  2)处理业务逻辑在第二个try里面。

  3)最后,不两个try 外面要打开自动提交功能。