>首页> IT >

php事务回滚不了怎么办

时间:2022-10-20 09:55:22       来源:PHP中文网

本教程操作环境:windows7系统、PHP8.1版、Dell G3电脑。


(资料图)

php事务回滚不了怎么办?

问题描述:

关于php 事务未执行回滚

mysqliphptransactionsTransactions not doing the rollback
登录后复制

我具有更新用户的功能:

function update_user_set_common($date_of_birth, $mobile, $street, $housenumber, $addition, $postal_code, $location, $country){    try {        $this->mysqli->begin_transaction();        $this->update_user_set_date_of_birth($date_of_birth);        $this->update_user_set_mobile($mobile);        $this->update_user_set_address($street, $housenumber, $addition, $postal_code, $location, $country);        $this->mysqli->commit();        return true;    } catch (Exception $e) {        $this->mysqli->rollback();        echo"Error:" . $e;        return false;    }}
登录后复制

如您所见,我进行了一笔交易。如果一切正常,则应提交,如果发生错误,则应回滚。

这是我的更新查询方式的一个示例:

function update_user_set_date_of_birth($date_of_birth){    return $this->update_user_set_singlefield(COL_USER_DATE_OF_BIRTH, $date_of_birth);}function update_user_set_singlefield($field, $value){    if ($update_stmt = $this->mysqli->prepare("UPDATE" . TABLE_USER ." SET" . $field ." = ? WHERE" . COL_USER_ID ." = ?")) :        if (!$update_stmt->bind_param("ss", $value, $this->USER_ID)) :            $update_stmt->close();            return false;        endif;        if (!$update_stmt->execute()) :            $update_stmt->close();            return false;        else :            $update_stmt->close();            return true;        endif;    else :        return false;    endif;}
登录后复制

因此现在例如update_user_set_mobile失败,但是没有回滚。 update_user_set_date_of_birth之前的语句仍然会执行,并且不会变回原先。

为什么没有回滚?

示例创建表以显示我使用innodb:

CREATE TABLE `USER` (  `USER_ID` bigint(20) NOT NULL PRIMARY KEY AUTO_INCREMENT,  `USER_E_MAIL` varchar(255) COLLATE utf8_bin NOT NULL,  `USER_PASSWORT` varchar(255) COLLATE utf8_bin NOT NULL,  `USER_PASSWORT_SALT` varchar(255) COLLATE utf8_bin NOT NULL,  `USER_FIRSTNAME` varchar(255) COLLATE utf8_bin NOT NULL,  `USER_LASTNAME` varchar(255) COLLATE utf8_bin NOT NULL,  `USER_DATE_OF_BIRTH` varchar(200) COLLATE utf8_bin DEFAULT NULL,  `USER_MOBILE` varchar(255) COLLATE utf8_bin DEFAULT NULL,  `ADDRESS_ID` bigint(20) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
登录后复制

问题解决:

关闭自动提交而不是mysqli-> begin_transaction();

$this->mysqli->autocommit(false);
登录后复制

http://php.net/manual/zh/mysqli.autocommit.php

推荐学习:《PHP视频教程》

以上就是php事务回滚不了怎么办的详细内容,更多请关注php中文网其它相关文章!

关键词: 相关文章 视频教程 问题描述