Получить UnCommitted данные в MySQL

В SQL Server мы можем написать ниже SQL Queries чтобы получить данные Un-Committed в базе данных. Это означает, что данные, которые все еще находятся в транзакции, и транзакция не завершена.

Запрос SQL Server

 Select * from TableName With(NoLock); 

Есть ли какая-либо эквивалентность в базе данных MySQL для получения данных, даже если таблица заблокирована? Я пытаюсь это в PHP CodeIgnitor

    Найдено статья с названием « Синтаксис 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 data. Мы также можем установить уровень изоляции для всех соединений по всему миру:

      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. Используется 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(); конечные //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(); 
     SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; SELECT * FROM TABLE_NAME ; COMMIT ; 

    Справка

    Операторы SELECT выполняются без блокировки, но может использоваться более ранняя версия строки. Таким образом, используя этот уровень изоляции, такие чтения несовместимы. Это также называется грязным чтением. В противном случае этот уровень изоляции работает как READ COMMITTED.

    SERIALIZABLE

    Этот уровень похож на REPEATABLE READ, но InnoDB неявно преобразует все простые инструкции SELECT в SELECT … LOCK IN SHARE MODE, если автоматическая защита отключена. Если autocommit включен, SELECT является его собственной транзакцией. Поэтому он известен только для чтения и может быть сериализован, если выполняется как согласованное (неблокирующее) чтение и не должно блокироваться для других транзакций. (Чтобы заставить простой SELECT блокировать, если другие транзакции изменили выбранные строки, отключите autocommit.)

    автокоммит

     Command-Line Format --autocommit[=#] System Variable Name autocommit Variable Scope Global, Session Dynamic Variable Yes Permitted Values Type boolean Default ON 

    Режим автосохранения. Если установлено значение 1, все изменения в таблице вступают в силу немедленно. Если установлено значение 0, вы должны использовать COMMIT для принятия транзакции или ROLLBACK для ее отмены. Если autocommit равен 0 и вы меняете его на 1, MySQL выполняет автоматический COMMIT любой открытой транзакции. Другой способ начать транзакцию – использовать инструкцию START TRANSACTION или BEGIN. См. Раздел 13.3.1 «Синтаксис транзакции« СТАВКА »,« КОМИТЕТ »и« РОЛЛБ » .

    По умолчанию клиентские соединения начинаются с автоматического набора, установленного в 1. Чтобы заставить клиентов начинать с значения по умолчанию 0, задайте глобальное значение autocommit, запустив сервер с параметром –autocommit = 0. Чтобы установить переменную с помощью файла параметров, введите следующие строки:

     [mysqld] autocommit=0 

    См. Также

    Внутри воспламенителя кода перед любым запросом вы можете использовать следующую команду:

     $this->db->simple_query("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"); 

    Вы можете получить дополнительную информацию о уровне изоляции MySQL в документации . Для этого требуются таблицы innoDB.

    Для получения дополнительной информации о simple_query() , в соответствии с документацией codeigniter , она используется, когда запрос не возвращает результат.

    Только механизм хранения InnoDB полностью поддерживает транзакции. Он также реализует MVCC Oracle / PostgreSQL, который предотвращает блокировку блокировки блокировки строк. Чтобы получить сообщение «Read-Uncommitted» в InnoDB, перед выпуском запроса SET TRANSACTION LEVEL READ UNCOMMITTED .

    Синтаксис для этого в PHP выглядел бы примерно так:

     $dbh->exec('SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED'); $dbh->beginTransaction(); 

    Это устанавливает уровень изоляции до следующего COMMIT или ROLLBACK . Чтобы изменения уровня сохранялись в течение всего сеанса, используйте

     SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

    вместо.

    Что касается переопределения блокировки чтения без обмена для таблицы или строки, я не уверен, что это возможно, и я не могу думать о ситуации, когда это было бы желательно. Блокировки, не связанные с совместным пользованием, обычно не используются по какой-либо причине.