这是使用事务的好例子吗?

t3psigkw  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(356)

我有以下几点 update of the users table 和一个 selection 这给了我 updated result 就在更新之后,我想知道使用 transaction 在这里?如果是的话,那我用对了吗 codewisely together with prepared statements ?

try {

        // connect to the database
        require 'connect.php';
        // create an update query
        $conn->beginTransaction();
        $queryUpdate = $conn->prepare("UPDATE users SET userName=:userName, firstName=:firstName,
        lastName=:lastName, password=:password, image=:image  WHERE userId=:userId"); 
        $queryUpdate->bindParam( ':userId' , $sUserId );
        $queryUpdate->bindParam( ':userName' , $sNewUserName );
        $queryUpdate->bindParam( ':firstName' , $sNewFirstName );
        $queryUpdate->bindParam( ':lastName' , $sNewLastName );
        $queryUpdate->bindParam( ':password' , $sNewPassword );
        $queryUpdate->bindParam( ':image' , $sNewImagePath );
        $bResult = $queryUpdate->execute();
        // create another query to get some of the updated values
        $querySelect = $conn->prepare("SELECT users.userName, users.firstName, users.lastName, users.image
        FROM users WHERE userId=:userId");
        $querySelect->bindParam( ':userId' , $sUserId );
        // run query 
        $querySelect->execute();  
        $ajResult = $querySelect->fetch(PDO::FETCH_ASSOC);
        // take each property one by one
        $sUserName = $ajResult['userName'];
        $sFirstName = $ajResult['firstName'];
        $sLastName = $ajResult['lastName'];
        $sImagePath = $ajResult['image'];
        // i.e. no query has failed, and we can commit the transaction
        $conn->commit();
        $sjResponse = $bResult ? '{"status":"ok", "userName":"'.$sUserName.'", "firstName":"'.$sFirstName.'",
         "lastName":"'.$sLastName.'", "image":"'.$sImagePath.'"}' : '{"status":"error"}'; 
        echo $sjResponse;
} catch (Exception $e) {
        // An exception has been thrown
        // We must rollback the transaction
        echo "ERROR";
        $conn->rollback();

}
ia2d9nvy

ia2d9nvy1#

如果只需要传回更新的结果,如果更新执行成功,则传回刚刚在更新中使用的值。作为额外的支票-你可以用 rowCount() 检查它是否真的更新了。

require 'connect.php';
// create an update query
$queryUpdate = $conn->prepare("UPDATE users SET userName=:userName, firstName=:firstName,
lastName=:lastName, password=:password, image=:image  WHERE userId=:userId"); 
$queryUpdate->bindParam( ':userId' , $sUserId );
$queryUpdate->bindParam( ':userName' , $sNewUserName );
$queryUpdate->bindParam( ':firstName' , $sNewFirstName );
$queryUpdate->bindParam( ':lastName' , $sNewLastName );
$queryUpdate->bindParam( ':password' , $sNewPassword );
$queryUpdate->bindParam( ':image' , $sNewImagePath );
$bResult = $queryUpdate->execute();
$sjResponse = ( $bResult && $queryUpdate->rowCount() == 1) ? 
   '{"status":"ok",
    "userName":"'.$sUserName.'", 
    "firstName":"'.$sNewFirstName.'",
    "lastName":"'.$sNewLastName.'", 
    "image":"'.$sNewImagePath.'"}' 
  : '{"status":"error"}'; 
echo $sjResponse;

至于事务—当您对数据库进行多次更新/插入/删除时,它们更相关。因此,例如,如果您想将一些点从一个用户转移到另一个用户,那么您需要确保从用户a获取的值能够传递给用户b。如果从a中减去值,然后更新用户b失败,那么这些点可能就消失了。使用事务,这可以回滚这两个更改,并且一切都是一致的。

4zcjmb1e

4zcjmb1e2#

我想知道在这里使用事务处理是否合适?
不,你只有一个update语句来操作这个表。
所以,将多个sql组合成单个事务的目的,也是所有相关sql的逻辑分组类型,它们应该以相同的顺序执行。而且,您还可以使用其他一些功能,如 SAVEPOINT , ROLLBACK 以及 COMMIT 尽管其中一些可以在执行简单查询(没有事务)时使用。
我建议阅读事务语句和锁定语句

相关问题