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