在sql Server中,我们可以在下面的SQL查询中编写以获取数据库中的未提交数据.这意味着仍处于事务和事务处理的数据尚未完成.
- Select * from TableName With(NoLock);
发现一篇标题为“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:
您可以在运行语句之前在查询中设置隔离级别.下面是简单的PHP MysqLi代码tu使用隔离级别读取uncommited
- //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();