php事务处理mysql与PDO实例

7 篇文章 0 订阅

MySQL事务处理

MySQL对事务的支持:
被操作的表必须是innoDB类型的表(支持事物)
MySQL常用的表类型:MySAM(非事物)增删改速度快,InnodB(事务型)安全性高

如果mysql表不是innoDB需要修改表的类型为innoDB。

修改方法是:
mysql> alter table mytable engine=innodb;

mysql命令行事务处理:

默认的mysql表的事务处理与自动提交是关着的,如果想让mysql表有事务处理就先需要先把自动提交关掉,然后开启事务

关闭自动提交方法:
mysql>set autocommit=0;
Query OK, 0 rows affected <0.00 sec>
开启事务:
mysql>start transaction;
Query OK, 0 rows affected <0.00 sec>

当开启事务后假设现在想删除一条语句

mysql>delete from mytable where id=1;
Query OK , 1 rows affected <0.00 sec>

这个时候还不是真正的删除这条语句所以可以使用roolback返回之前删除的内容。

mysql>roolback;
Query OK, 0 rows affected <0.05 sec>

如果想真正的删除这条id为1内容,执行完删除语句之后还需要在执行以下commit 才算是真正的删除

mysql>commit;
Query OK, 0 rows affected <0.05 sec>

PHP程序里的PDO事务处理:

配置事物处理

1. 关闭PDO自动提交:
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
2. 开启一个事务需要的方法:
$pdo->beginTransaction(); //开启事物
$pdo->commit(); // 提交事务
$pdo->rollback(); // 回滚事务

注意: 只有通过 PDO::beginTransaction() 启动一个事务后,才可能发生自动回滚。如果手动发出一条查询启动事务, 则 PDO 无法知晓,从而在必要时不能进行回滚。

3. 一般事务处理是运行在try{…..}catch{….}语句中:

在下面例子中,假设A转账给B。
两个更新分别完成起来很简单,但通过封闭在 PDO::beginTransaction() 和PDO::commit() 调用中,可以保证在更改完成之前,其他人无法看到这些更改。
如果发生了错误,catch 块回滚自事务启动以来发生的所有更改,并输出一条错误信息。

 try{
    //创建对象
    $pdo=new PDO("mysql:host=localhost:3306;dbname=mydb","root","password");
    //设置错误使用异常模式
    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    //关闭自动提交
    $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
    //array(PDO::ATTR_AUTOCOMMIT=>0));   //也可以使用这个方法关闭自动提交
  }catch(PDOException $e){
    echo "Unable to connect:".$e->getMessage(); 
  }

try{

    //在事务中执行批处理:
    $pdo->beginTransaction();  //开启事物
    $price=10;   //十块钱
    //A转出10元
    $rows=$pdo->exec("update mytable set money=money-{$price} where id=10");
    if($affected_rows>0){
        echo "A转出{$price}元!<br/>";
    }else{
        throw new PDOException("A转出失败!<br/>");
    }
    //B收到10元
    $rows=$pdo->exec("update mytable set money=money+{$price} where id=22");
    if($affected_rows>0){
        echo "B收到{$price}元";
    }else{
        throw new PDOException("B收取失败!<br/>");
    }
    echo "交易成功!<br/>";

    //提交以上操作
    $pdo->commit();

}catch(PDOException $e){
    echo "错误:".$e->getMessage();
    echo "交易失败!<br/>";
    $pdo->roolback();  //撤销所有的操作并返回修改的数据内容
}
//运行完成以后,最后开启自动提交
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,1);     

注意:在整个程序中有一部分是需要自动提交的所以在整个代码执行完了之后需要开启自动提交

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值