【发布时间】:2011-10-27 16:34:30
【问题描述】:
我是第一次尝试 PDO 事务。下面的代码不起作用。我们尝试插入的电子邮件地址有重复,因此它应该会失败。它确实给了我一个错误。但是第一个插入被插入到数据库中并且它不会回滚。如果我在提交之前将 PDO::rollBack 移动到 Try{ 中,我知道回滚工作原因,它确实会回滚。我认为问题在于它没有捕捉到错误,因此没有调用 PDO::rollBack。有什么想法吗?
try {
PDO::beginTransaction();
$sql = "INSERT INTO .`tblUsersIDvsAgencyID` (`id`, `agency_id`) VALUES (NULL, :agencyID)";
$STH = $this->prepare($sql);
$STH->bindParam(':agencyID', $AgencyUser['agency_id']);
$STH->execute();
$userID = parent::lastInsertId();
$sql = "INSERT INTO `tblUsersEmailAddress` (`id`, `user_id`, `email_address`, `primary`, `created_ts`, `email_verified`) VALUES (NULL , :userID , :EmailAddress , '1', CURRENT_TIMESTAMP , '0' )";
$STH = $this->prepare($sql);
$STH->bindParam(':userID', $userID);
$STH->bindParam(':EmailAddress', $email_address);
$STH->execute();
PDO::commit();
echo 'Data entered successfully<br />';
}
catch(PDOException $e)
{
/*** roll back the transaction if we fail ***/
PDO::rollBack();
echo "failed";
}
【问题讨论】:
-
你为什么要像
PDO::beginTransaction();这样静态调用事务方法?您应该非静态地调用它们,例如:$this->beginTransaction();。至少,我认为它需要一个特定的连接才能知道在哪里应用事务调用。