为什么mysqli open transcation会锁定数据库?

use*_*104 4 php mysql mysqli transactions

我试图使用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();
Run Code Online (Sandbox Code Playgroud)

更新:我终于发现问题是由另一个查询引起的.简而言之,上面的编码是插入日志,而下面的查询是检查用户登录时是否存在日志表.问题是,当我打开一个事务并尝试记录操作(操作需要> 30秒)的结果时,我无法执行下面的查询(等待表metalock)所以整个系统一直保持到操作完成,如何修理它?谢谢

$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); 
Run Code Online (Sandbox Code Playgroud)

Art*_*tur 5

适当的顺序是:

$mysqli->autocommit(FALSE);
$mysqli->query("INSERT INTO ...");
$mysqli->commit();
Run Code Online (Sandbox Code Playgroud)

但是对于一个小插件来说这样做很奇怪.在您的特定情况下,仅执行此操作就足够了:

$mysqli->query("INSERT INTO ...);
Run Code Online (Sandbox Code Playgroud)

没有自动提交禁用和没有提交.