Php 在PDO中在何处回滚事务?

Php 在PDO中在何处回滚事务?,php,mysql,database,insert,pdo,Php,Mysql,Database,Insert,Pdo,我的问题是,我有一个数据库设计从这个链接 编辑*确定是否使用事务?但是如果回滚失败,我应该把它放在哪里呢 $dbConnect->beginTransaction(); $RegisterInsert = $dbConnect->prepare("INSERT INTO companies ( `name`, `address`, `email`, `phone`, `link`, `verified`) VALUES ( :name, :address, :em

我的问题是,我有一个数据库设计从这个链接

编辑*确定是否使用事务?但是如果回滚失败,我应该把它放在哪里呢

 $dbConnect->beginTransaction();
 $RegisterInsert = $dbConnect->prepare("INSERT INTO companies (
    `name`, `address`, `email`, `phone`, `link`, `verified`) VALUES (
    :name, :address, :email, :phone, :link, :verified)");
    $RegisterInsert->execute($RegisterData);

    $RegisterData2['CID'] = $dbConnect->lastInsertId();  

    $RegisterInsert = $dbConnect->prepare("INSERT INTO users_companies (
    `UID`, `CID`, `role`) VALUES (
    :UID, :CID, :role)");
    $RegisterInsert->execute($RegisterData2);
    $dbConnect->commit();
我应该把回滚放在哪里


谢谢

事务应该以
回滚()
提交()
结束(仅其中一个)

它通常与
if…else
语句一起使用,因为在逻辑上只应执行其中一个语句

$dbConnect->beginTransaction();

//somecode
//$dbConnect->execute( $someInsert );
//some more code
//$result = $dbConnect->execute( $someSelect );
//$nextRow = $result->fetchRow();

//either commit or rollback!
if( $someResultCheck == true )
    $dbConnect->commit();
else
    $dbConnect->rollback();

当查询涉及复杂的逻辑时,通常使用事务


如果您使用的是MySQL,请确保您没有对表使用MyISAM引擎,因为它不支持事务。

一旦您知道整个事务将失败,您应该回滚到目前为止所做的操作,并且不要尝试任何进一步的更新-因此在伪代码中:

 function do_updates(array updates)
 { 
    PDO->beginTransaction();
    foreach (updates as statement) {
       run statement
       if failed {
         PDO->rollback(); 
         return false;
       }
    }
    return PDO->commit();


C.

是的,我有点困惑我应该做什么?(我从来没用过)或者像这样做,或者加入?或者其他我可能错过的,谢谢pascal留下评论:)可能重复的:,,是的,我知道,我不知道这个问题的最佳标题,请编辑它。您应该始终使用具有适当错误处理的事务,以确保数据库保持一致(如果由于磁盘空间不足或MySQL崩溃导致第二次插入失败,会发生什么情况),但并非所有MySQL表类型都支持事务的使用…例如,MyISAM不支持,InnoDB支持。将autoCommit设置为false应在事务结束时强制回滚,除非您显式提交…我不知道提交失败时是否会自动回滚。我更喜欢在代码中显式提交和回滚,因此当其他开发人员看到它时,不会有误解。除非autoCommit设置为falseok,否则您的代码不能保证自动回滚,所以我们应该在RegisterInsert上执行$someResultCheck?对吗?@kaskus:对。您只想在两个插入都成功执行时提交。所以您必须执行
 $someResultCheck=$RegisterInsert->execute($stmt);
@mark:autoCommit只对事务外部的语句有用,其中单个语句被包装在事务内部。当您手动开始事务时,它不适用于事务内部。@Kalyan-感谢您的澄清。正如我在其他地方所说,我总是编写显式事务启动和提交/回滚的代码,因为我永远不会与其他正在阅读代码的开发人员产生任何误解