【发布时间】:2013-10-29 09:21:34
【问题描述】:
我正在尝试使用 mysqli 插入数据,但出现了一些奇怪的行为。例如,当我第一次使用$mysqli->autocommit(FALSE); 并花了几分钟运行我的PHP 并等待提供的查询时,它将保留数据库直到$mysqli->commit();,所以我无法执行任何其他数据库操作。当我在 phpmyadmin 中检查状态时,它显示即将到来的 SQL 查询状态为 Waiting for table metalock ,如何解决?谢谢
/* Insert log Query */
function putLog($query){
global $mysqli,$ip,$browser,$dateLog,$isQuerySuccess;
$isQuerySuccess = $mysqli->query("INSERT INTO DPS_Log_$dateLog (PageID,FunctionID,ActionID,UserID,UserIP,UserInfo,LogType,Remark,LogTime) VALUES (15,20,25,25,'$ip','$browser',1,'$query',NOW())") ? true : false;
}
/* Start DB connection */
$mysqli = new mysqli(DATABASEIP, DBUSER, DBPWD, DATABASE,PORT);
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$mysqli->autocommit(FALSE);
$isQuerySuccess = true;
putLog ("Fail to delete: $folderPath.$item");
$isQuerySuccess ? $mysqli->commit() : $mysqli->rollback();
$mysqli->close();
更新: 我终于发现问题是由另一个查询引起的。简而言之,上面的编码是插入日志,下面的查询是在用户登录时检查日志表是否存在。问题是,当我打开一个事务并尝试记录操作(操作需要> 30秒)结果时,我无法执行以下查询(等待表金属锁)所以整个系统一直保持到操作完成,如何修理它?谢谢
$sql = "
CREATE TABLE IF NOT EXISTS `$logTableName` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`PageID` int(2),
`FunctionID` int(2),
`ActionID` int(3) NOT NULL,
`UserID` int(5) NOT NULL,
`UserIP` varchar(15) COLLATE utf8_unicode_ci NOT NULL,
`UserInfo` text COLLATE utf8_unicode_ci NOT NULL,
`LogType` int(1) NOT NULL DEFAULT '1',
`Remark` text COLLATE utf8_unicode_ci NOT NULL,
`LogTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
";
$this -> databaseHelper -> common_query($sql);
【问题讨论】:
-
做你的操作,然后离开。无论如何,从dev.mysql.com/doc/refman/5.7/en/sql-syntax-transactions.html 和dev.mysql.com/doc/refman/5.7/en/innodb-concepts.html 开始 - 请注意,需要锁定或其他形式的控制(例如 MVCC)来维持 ACID。锁定的具体内容(以及锁定方式)取决于多种因素。
-
你想要无锁方式吗,比如添加一个
status列并在putlog之后更新它 -
请通过php.ini设置增加你的php执行时间
-
显示您的另一个查询。
-
如果您需要一些位于函数范围之外的变量 (
global $mysqli,$ip,$browser,$dateLog,$isQuerySuccess;),将其作为参数传递,不要 (ab-) 使用global这么多
标签: php mysql transactions mysqli