使用PHP mysqli_query查询单个SELECT的隔离级别


Isolation level for single SELECT query with PHP mysqli_query

我有一个InnoDB数据库,有一个表,book。此外,我有一个PHP脚本,其中包含一个查询,用于显示book表中的图书数量:

SELECT COUNT(*) FROM book
如你所知,使用mysqli扩展名,可以使用mysqli_begin_transaction创建事务。接下来,可以定义隔离级别。

在我的例子中,我不需要事务相关的函数,我使用mysqli_query,因为它只是一个SELECT查询。然而,我知道即使是一个查询也被封装在MySQL的事务中,默认的隔离级别是REPEATABLE READ。

问题在这里:我不希望只执行这样一个查询的REPEATABLE READ开销。READ UNCOMMITTED已经足够了

问题:mysqli_extension是否自动检测到我正在使用单个SELECT查询(因为我没有开始任何事务)并自动将隔离级别设置为READ UNCOMMITTED(或最多READ committed),或者我需要定义一个wrap类来始终设置READ UNCOMMITTED隔离级别,然后再执行这样的transaction-with-only- SELECT-query ?

不,mysqli_query不会自动更改隔离级别。通过mysql连接在很多方面就像通过mysql cli连接一样。在这两种情况下,您都将获得默认隔离级别。就像cli一样,mysqli不能对通过连接的语句做出任何假设。

无论如何,如果你有一些很好的理由关心隔离级别,我认为你应该明确地设置它,例如:

$mysqli_connection->query("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");

这样你就可以确保你有你想要的隔离级别,并且你可以在代码中注释你的原因。