这是使用交易的好案例吗?
Is this a good case to use a transaction?
我有以下 update of the users table
和一个 selection
,它在更新后立即给我 updated result
,我想知道使用 [=14= 是否合适] 这里?另外,如果是,那么我是否正确使用它 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();
}
如果你只需要传回更新的结果,如果更新执行成功,则传回你刚刚在更新中使用的值。作为一项额外检查 - 您可以使用 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;
至于事务 - 当您对数据库执行多个 updates/insert/deletes 时,它们更相关。因此,例如,如果您想将一些点数从一个用户转移到另一个用户 - 您想要确保从用户 A 中扣除的值到达用户 B。如果您从 A 中减去该值,然后更新用户 B 时出现问题,那么点可能会消失。使用事务,这可以回滚两个更改并且一切都是一致的。
I am wondering if is it appropriate to use a transaction here?
IMO,不。你只有一个更新语句来操纵 table。
因此,将多个 SQL 组合成单个事务的目的,也是所有相关 SQL 的逻辑分组类型,它们应该以相同的顺序执行。并且,您将能够使用一些其他功能,如 SAVEPOINT
、ROLLBACK
和 COMMIT
,尽管其中一些可以在执行简单查询(无事务)时使用。
我有以下 update of the users table
和一个 selection
,它在更新后立即给我 updated result
,我想知道使用 [=14= 是否合适] 这里?另外,如果是,那么我是否正确使用它 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();
}
如果你只需要传回更新的结果,如果更新执行成功,则传回你刚刚在更新中使用的值。作为一项额外检查 - 您可以使用 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;
至于事务 - 当您对数据库执行多个 updates/insert/deletes 时,它们更相关。因此,例如,如果您想将一些点数从一个用户转移到另一个用户 - 您想要确保从用户 A 中扣除的值到达用户 B。如果您从 A 中减去该值,然后更新用户 B 时出现问题,那么点可能会消失。使用事务,这可以回滚两个更改并且一切都是一致的。
I am wondering if is it appropriate to use a transaction here?
IMO,不。你只有一个更新语句来操纵 table。
因此,将多个 SQL 组合成单个事务的目的,也是所有相关 SQL 的逻辑分组类型,它们应该以相同的顺序执行。并且,您将能够使用一些其他功能,如 SAVEPOINT
、ROLLBACK
和 COMMIT
,尽管其中一些可以在执行简单查询(无事务)时使用。