找到一篇标题为“MySQL NOLOCK 语法”的文章
http://itecsoftware.com/with-nolock-table-hint-equivalent-for-mysql
SQL Server WITH (NOLOCK) 如下所示:
SELECT * FROM TABLE_NAME WITH (nolock)
为实现与 MySQL 相同的效果,我们使用SET SESSION 命令更改会话隔离模式。
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ;
您也可以通过以下方式实现:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
COMMIT ;
此语句的工作方式类似于 WITH (NOLOCK),即 READ UNCOMMITTED 数据。我们还可以全局设置所有连接的隔离级别:
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
另外,MySQL服务器中还存在两个与隔离级别相关的系统变量:
SELECT @@global.tx_isolation; (global isolation level)
SELECT @@tx_isolation; (session isolation level)
或者在事务内部设置隔离级别:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO
在代码点火器中,您可以使用前两个解决方案包装查询,也可以使用全局选项。
您可以使用以下代码供您参考:
$this->db->query("SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE");
$this->db->trans_start();
// your code
$this->db->trans_complete();
更新 1:
您可以在运行语句之前在查询中设置隔离级别。下面是你使用isolation level read uncommited的简单php mysqli代码
//db connection
$mysqli = new mysqli('localhost', 'user', 'pass', 'db');
//set isolation level
$mysqli->query("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
//your Select Query
$results = $mysqli->query("SELECT * FROM tablename");
while($row = $results->fetch_assoc()) {
//some statements
}
// Frees the memory associated with a result
$results->free();
$mysqli->query("COMMIT");
// close connection
$mysqli->close();