【问题标题】:How to use transaction in php/mysql如何在 php/mysql 中使用事务
【发布时间】:2011-03-09 06:16:01
【问题描述】:

我正在使用 php/mysql。我知道 mysql 中的事务,但不能在我的脚本中使用。下面是我的脚本如何在我的代码中使用 php 事务。即 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++;
}
}

【问题讨论】:

  • 您可以通过...在正确的地方使用它们?你能澄清你的问题吗?很难说出你在问什么。
  • 我在询问事务,我的问题的目的是有时会执行第一个查询并将数据插入到数据库中,但第二个查询没有正确执行,所以我想回滚事务以便插入顺序不受影响。

标签: php mysql


【解决方案1】:

只需发出 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 这是一个性感的、简洁的表达方式。
  • 我嵌套查询只是因为它是 foreach 循环的一部分,请查看我更新的问题。
  • @hunter 无论您拥有什么,您都可以使用该策略。只需将所有内容都用try 包装起来,当您决定强制执行 ROLLBACK 时,您会抛出异常。请注意,在您的情况下,不可能在同一运行中执行两个插入,因此实际上并不需要事务。您是否打算添加一些其他查询?
  • 是的,在收集了三个变量product, ordersale 之后,我想在执行这三个查询后将它们插入到用户表中。那你应该给我推荐什么。
  • 正如你所说,所以事务并不是真正需要的,所以在我的情况下,如果成功插入了 query1 并且在第二个查询中存在一些错误,那么如何能够回滚.
【解决方案2】:

一种选择是使用 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();

}

【讨论】:

    【解决方案3】:

    此处适用的规则/语法与常规 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

    【讨论】:

      猜你喜欢
      • 2018-01-24
      • 1970-01-01
      • 2012-07-29
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 2017-01-03
      相关资源
      最近更新 更多