Получить UnCommitted данные в MySQL
В SQL Server
мы можем написать ниже SQL Queries
, чтобы получить Un-Committed данные в базе данных. Это означает, что данные, которые все еще находятся в транзакции, и транзакция не завершена.
Запрос SQL Server
Select * from TableName With(NoLock);
Есть ли какая-либо эквивалентность в базе данных MySQL для получения данных, даже если таблица заблокирована? Я пытаюсь это в PHP CodeIgnitor
Ответы
Ответ 1
Нашел статью с заголовком " Синтаксис 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) i.e READ UNCOMMITTED
. Мы также можем установить уровень изоляции для всех соединений по всему миру:
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 tu use 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();
Ответ 2
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
COMMIT ;
Ссылка
Ответ 3
Только механизм хранения 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
вместо.
Что касается переопределения блокировки чтения без обмена для таблицы или строки, я не уверен, что это возможно, и я не могу думать о ситуации, когда это было бы желательно. Неблокирующие блокировки обычно не используются по какой-либо причине.
Ответ 4
Операторы SELECT выполняются без блокировки, но может использоваться более ранняя версия строки. Таким образом, используя этот уровень изоляции, такие чтения несовместимы. Это также называется грязным чтением. В противном случае этот уровень изоляции работает как READ COMMITTED.
SERIALIZABLE
Этот уровень похож на REPEATABLE READ, но InnoDB неявно преобразует все простые операторы SELECT в SELECT... LOCK IN SHARE MODE, если автокомиссия отключена. Если autocommit включен, SELECT является его собственной транзакцией. Поэтому он известен только для чтения и может быть сериализован, если выполняется как согласованное (неблокирующее) чтение и не должно блокироваться для других транзакций. (Чтобы заставить простой SELECT блокировать, если другие транзакции изменили выбранные строки, отключите автозапуск.)
автокоммит
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, "Синтаксис транзакции" СТАВКА "," КОМИТЕТ "и" РОЛЛБэк".
По умолчанию клиентские соединения начинаются с набора autocommit, установленного в 1. Чтобы заставить клиентов начинать с значения по умолчанию 0, задайте глобальное значение autocommit, запустив сервер с параметром --autocommit = 0. Чтобы установить переменную с помощью файла параметров, включите следующие строки:
[mysqld]
autocommit=0
См. также
Ответ 5
Внутри воспламенителя кода вы можете использовать следующую команду перед любым запросом:
$this->db->simple_query("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
Вы можете получить дополнительную информацию о уровне изоляции MySQL в документации. Для этого требуются таблицы innoDB.
Для получения дополнительной информации о simple_query()
, в соответствии с codeigniter documentation, она используется, когда запрос не возвращает результат.