在MySQL中获取未提交的数据

18 php mysql codeigniter sql-server-2012 codeigniter-3

SQL Server我们可以在下面写SQL Queries让数据库取消提交的数据.这意味着仍在交易和交易中的数据不完整.

SQL Server查询

Select * from TableName With(NoLock);
Run Code Online (Sandbox Code Playgroud)

即使表被锁定,MySQL数据库中是否有任何等价来获取数据?我在PHP CodeIgnitor中尝试这个

Che*_*eta 13

找到一篇标题为" MySQL NOLOCK syntax "的文章

http://itecsoftware.com/with-nolock-table-hint-equivalent-for-mysql

SQL Server WITH(NOLOCK)看起来像这样:

SELECT * FROM TABLE_NAME WITH (nolock)
Run Code Online (Sandbox Code Playgroud)

为了实现与MySQL相同,我们使用该SET SESSION命令更改会话隔离模式.

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
 SELECT * FROM TABLE_NAME ;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ;
Run Code Online (Sandbox Code Playgroud)

你也可以通过以下方式实现同​​样的目标:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
COMMIT ;
Run Code Online (Sandbox Code Playgroud)

此语句将类似于WITH(NOLOCK)即READ UNCOMMITTED数据.我们还可以为全局连接设置隔离级别:

 SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
Run Code Online (Sandbox Code Playgroud)

另外,MySQL服务器中存在两个与隔离相关的系统变量:

SELECT @@global.tx_isolation; (global isolation level)
SELECT @@tx_isolation; (session isolation level)
Run Code Online (Sandbox Code Playgroud)

或者在事务中设置隔离级别:

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO
Run Code Online (Sandbox Code Playgroud)

在代码点火器中,您可以使用前两个解决方案包装查询,也可以使用全局选项.

供您参考,您可以使用以下代码:

$this->db->query("SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE");
$this->db->trans_start();

// your code

$this->db->trans_complete();
Run Code Online (Sandbox Code Playgroud)

更新1:

您可以在运行语句之前在查询中设置隔离级别.下面是简单的php mysqli代码tu使用isolation level read 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();
Run Code Online (Sandbox Code Playgroud)


Pan*_*kaj 5

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
COMMIT ;
Run Code Online (Sandbox Code Playgroud)

参考


Dar*_*rax 3

只有InnoDB存储引擎完全支持事务。它还实现了 Oracle/PostgreSQL 风格的 MVCC,可防止隐式行锁阻塞读取。要在 InnoDB 中获取未提交读,请SET TRANSACTION LEVEL READ UNCOMMITTED在发出查询之前发出 a 。

在 PHP 中执行此操作的语法如下所示:

$dbh->exec('SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED');
$dbh->beginTransaction();
Run Code Online (Sandbox Code Playgroud)

这将设置隔离级别直到下一个COMMITROLLBACK。要使级别更改在会话期间持续存在,请使用

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Run Code Online (Sandbox Code Playgroud)

反而。

至于覆盖表或行上的非共享读锁,我不确定这是否可能,我也无法想到需要这种情况的情况。非共享锁通常是非共享的,这是有原因的。