如何在php / mysql中使用事务

时间:2011-03-09 06:16:02

标签: php mysql

我正在使用php / mysql。我知道mysql中的事务但不能在我的脚本中使用。下面是我的脚本如何在我的代码中使用php事务.i.e BEGIN,ROLLBACK,COMMIT

foreach($json_a['shop'] as $jsondata=>$json)
{
if($json['category']==='product')
{
$name_product=$json['name'];
$query1="insert into product(id,name,user_id)values('','" . mysql_real_escape_string($name_product). "','1')";

$result1=mysql_query($query1) or die("error in query".mysql_errno());
//echo "success...!";
$product++;
}
else
if($json['category']==='order')
{
$name_order=$json['name'];
$query2="insert into order(id,name,user_id)values('','" . mysql_real_escape_string($name_order). "','1')";

$result2=mysql_query($query2) or die("error in query".mysql_errno());
$order++;
}
else
if($json['category']==='sale')
{
$name_sale=$json['name'];
$query3="insert into sale(id,name,user_id)values('','" . mysql_real_escape_string($name_sale). "','1')";

$result3=mysql_query($query3) or die("error in query".mysql_errno());
$sale++;
}
}

3 个答案:

答案 0 :(得分:13)

只需发出mysql_query('START TRANSACTION');并检查每个插页的错误。如果其中一个没有成功,则立即发出ROLLBACK而不执行任何剩余的查询。如果一切顺利,所有人都会发出一个COMMIT。

将它们放在try-catch块中可能更容易,以避免使用if-else使用太多级别的嵌套。

// START TRANSACTION
try{
    // INSERT 1
    if(failed)
        throw new Exception();

    // INSERT 2
    if(failed)
        throw new Exception();

    // INSERT 3
    if(failed)
        throw new Exception();

    // COMMIT
}
catch(Exception $e){
    // ROLLBACK
}

您可能还想了解PHP的PDO extension。交易是其功能的一部分。

答案 1 :(得分:5)

一种选择是使用PDO。例如:

$db = new PDO($dsn,$user,$password);

$db->beginTransaction();
$db->exec("delete from mytable");

$allGood = doSomethingElse();

if ($allGood)
{
  $db->commit();
} else {
  $db->rollBack();
}

或更优雅的方法:

$db = new PDO($dsn,$user,$password);
$db->beginTransaction();

try{
  //first execution      
  $db->exec("delete from mytable");

  //second execution
  $db->exec("insert into anothertable");

  //if all went well
  $db->commit();

} catch (Exception $e) {

  //something broke, hit undo
  $db->rollBack();

}

答案 2 :(得分:2)

这里适用的规则/语法与关于事务的常规MySQL语句相同。

以下是一个例子:

$query0 = 'START TRANSACTION;';
mysql_query($query0) or die('woops' . mysql_error());

/* all of your queries here */

$query5 = 'COMMIT;';
mysql_query($query5) or die('woops' . mysql_error());

有关事务的MySQL语法的更多信息,请访问:http://dev.mysql.com/doc/refman/5.0/en/commit.html