「MySQLNOLOCK構文」というタイトルの記事が見つかりました "
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 ;
さらに、分離に関連する2つのシステム変数もMySQLサーバーに存在します。
SELECT @@global.tx_isolation; (global isolation level)
SELECT @@tx_isolation; (session isolation level)
または、トランザクション内で分離レベルを設定します:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO
コードイグナイターでは、クエリを最初の2つのソリューションでラップするか、グローバルオプションを使用できます。
参考までに、以下のコードを使用できます:
$this->db->query("SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE");
$this->db->trans_start();
// your code
$this->db->trans_complete();
更新1:
ステートメントを実行する前に、クエリで分離レベルを設定するだけです。以下は、単純なphpmysqliコードです。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();