2015-11-25 3 views
14

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

запросов SQL Server

Select * from TableName With(NoLock); 

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

+0

нужен образец кода в виде PHP и MySQL для взаимодействия с базой данных – Pankaj

+0

см это может помочь Http: // StackOverflow.com/questions/917640/any-way-to-select-without-cause-locking-in-mysql – Linus

ответ

1

Только механизм хранения 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 

вместо этого.

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

+1

Нужно использовать код примера в форме PHP и MySQL для взаимодействия с базой данных – Pankaj

+0

MyISAM не знает о транзакциях. Нет «фиксации». Вся таблица заблокирована до тех пор, пока запрос не завершится, поэтому нет возможности увидеть «незафиксированные» данные. –

1

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

SERIALIZABLE

Этот уровень, как REPEATABLE READ, но InnoDB неявно преобразует все равнину ЗЕЬЕСТ в SELECT ... LOCK IN SHARE MODE, если автокоммит отключен. Если autocommit включен, 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. См. Section 13.3.1, “START TRANSACTION, COMMIT, and ROLLBACK Syntax”.

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

[mysqld] 
autocommit=0 

See This also

+0

Нужно использовать код примера в форме PHP и MySQL для взаимодействия с базой данных – Pankaj

+0

Я думаю, что любая вещь, которую вы выберете с вашим php, будет недействительной, если вы не зафиксируете ее. –

1

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

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

Вы можете получить более подробную информацию о MySQL isolation level in the documentation. Для этого требуются таблицы innoDB.

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

+0

Нужен образец кода в виде PHP и MySQL для взаимодействия с базой данных – Pankaj

+0

@Helper Это уже PHP и MySQL. Если ваша проблема не касается codeigniter, вы должны использовать 'mysqli_query()' вместо '$ this-> db-> simple_query()'. – Adam

9

Найдено статью с заголовком "синтаксис MySQL NOLOCK"

http://itecsoftware.com/with-nolock-table-hint-equivalent-for-mysql

SQL Server С (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 ; 

Вы можете achive же путем ниже также:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; 
SELECT * FROM TABLE_NAME ; 
COMMIT ; 

Это заявление будет работать похож на WITH (NOLOCK) 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(); 

Update 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(); 
+0

Нужно пример кода в форме PHP и MySQL для взаимодействия с базой данных – Pankaj

+0

@Helper см. Пример кода php для того же –

Смежные вопросы