php事务处理

一,php事务处理的概述

事务:若干个事件的集合

事务处理具有四个特性:原子性、一致性、独立性、持久性。

事务处理:当所有事件执行成功,事务才执行;若有任何一个事件不能成功执行,事务的其它事件也不被执行。

只要你的MySQL版本支持BDB或InnoDB表类型,那么你的MySQL就具有事务处理的能力。这里面,又以InnoDB表类型用的最多,虽然后来发生了诸如Oracle收购InnoDB等令MySQL不爽的事情,但是这类商业事件与技术无关,下面就以InnoDB表类型为例简单说一下MySQL中的事务处理。

配置事务处理需注意:

1、关闭 PDO 的自动提交;

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

2、开启一个事务需要的方法;

$pdo->beginTransaction(); // 开启一个事务

3.$pdo->commit(); // 提交事务

4.$pdo->rollback(); // 回滚事务

一般事务处理是运行在 try...catch...语句中,当事务失败时执行 catch 代码段。

二 以下是事务处理的一些代码

<?php

try {

$pdo->beginTransaction(); // 开启一个事务

$row = null;

$row = $pdo->exec("xxx");

// 执行第一个 SQL

if (!$row) throw new PDOException('提示信息或执行动作'); // 如出现异常提示信息或执行动作

$row = $pdo->exec("xxx");

// 执行第二个 SQL

if (!$row) throw new PDOException('提示信息或执行动作');

$pdo->commit();

}

catch (PDOException $e)

{

$pdo->rollback(); // 执行失败,事务回滚

exit($e->getMessage()

);

} ?>

下面的案例大家可以参考一下

<?php
  try {
  $pdo = new PDO( "mysql:host=localhost;dbname=psp" , "root" , "" );
  $pdo -> exec ( "set names utf8" );
  $pdo ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //设置异常处理模式
  $pdo ->setAttribute(PDO::ATTR_AUTOCOMMIT,0); //关闭自动提交
  } catch (PDOException $e ){
  echo "数据库连接失败" ;
  exit ;
  }
 
  try {
  $age =10;
  $pdo ->beginTransaction(); //开始事务
  $affected_rows1 = $pdo -> exec ( "update kfry set k_age=k_age+{$age} where k_name='user1'" );
  $affected_rows2 = $pdo -> exec ( "update kfry set k_age=k_age-{$age} where k_name='user2'" ); //随意更改使之执行成功或失败
  /* if($affected_rows1&&$affected_rows2)
  {
   $pdo->commit();
   echo "操作成功";
  }else{
   $pdo->rollback();
  } */
  if (! $affected_rows1 )
   throw new PDOException( "加入错误" );
  if (! $affected_rows2 )
   throw new PDOException( "减少错误" );
  echo "操作成功" ;
  $pdo ->commit(); //如果执行到此处前面两个更新sql语句执行成功,整个事务执行成功
  } catch (PDOException $e ){
  echo "操作失败:" . $e ->getMessage();
  $pdo ->rollback(); //执行事务中的语句出了问题,整个事务全部撤销
  }
  $pdo ->setAttribute(PDO::ATTR_AUTOCOMMIT,1);
  //测试是否成功
  echo "\n操作结果为:\n" ;
  $sql = "select * from kfry" ;
  $result = $pdo ->query( $sql );
  foreach ( $result as $v )
  {
  echo $v [ 'k_name' ]. " " . $v [ 'k_age' ]. "\n" ;
  }
?>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值