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)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
COMMIT ;
Run Code Online (Sandbox Code Playgroud)
只有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)
这将设置隔离级别直到下一个COMMIT或ROLLBACK。要使级别更改在会话期间持续存在,请使用
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Run Code Online (Sandbox Code Playgroud)
反而。
至于覆盖表或行上的非共享读锁,我不确定这是否可能,我也无法想到需要这种情况的情况。非共享锁通常是非共享的,这是有原因的。
| 归档时间: |
|
| 查看次数: |
7383 次 |
| 最近记录: |