Yii Framework Forum: Ошибка - Cannot execute queries while other unbuffered queries are active. - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Ошибка - Cannot execute queries while other unbuffered queries are active. что делать? Rate Topic: -----

#1 User is offline   Karasko 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 89
  • Joined: 14-July 09
  • Location:Russia

Posted 01 October 2009 - 09:13 AM

Всем привет )
При выполнении такого куска кода
$id = $_GET['id'];
		// get current menu order
		$sql = "SELECT menuOrder FROM categories WHERE id = $id ";
		
		$cmd =  app()->db->createCommand($sql);
		/*@var $cmd CDBCommand */
		//$cmd->bindValue('id',$id);
		$menuOrder = $cmd->queryScalar();
		
		
		$oldMenuOrder = $menuOrder + 1;
		
		// get id of next 
		$sql1 = "UPDATE categories SET menuOrder = menuOrder -1 WHERE menuOrder = $menuOrder +1 ";
		app()->db->createCommand($sql)->execute();
		 
		$sql2 = "UPDATE categories SET menuOrder = $oldMenuOrder WHERE id = $id";
		app()->db->createCommand($sql)->execute();

Получаю ошибку:

Quote

CDbCommand не удалось исполнить SQL-запрос: SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.


Платформа Winxp, Версия php 5.3.0, MySql 5.1.39-community, получаю эту ошибку при выполнении нескольких запросов к базе подряд, такого не случается если закрывать, а потом снова открывать новое соединение к БД.

Кто сталкивался? Причём на хостинге у меня нет таких проблем, выполняю подряд несколько SELECT, UPDATE, TRUNCATE и всё ок. Под виндой же всё ругается на unbuffered queries. Где ставить эту PDO::MYSQL_ATTR_USE_BUFFERED_QUERY перменную в случае конфига Yii ?
Спасибо )
0

#2 User is offline   KJedi 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 381
  • Joined: 19-October 08
  • Location:Nikolaev, Ukraine (Europe)

Posted 02 October 2009 - 02:40 AM

Я делал так:
Yii::app()->db->pdoInstance->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
перед своими проблемными запросами
НО оказщалось проще попросить хостера обновить БД (выделенный сервер у меня), потому что вылазили и другие обезьянки. Я не помню какие правда :)
помню что это было не единственно проблемой
Posted Image
My Blog: http://programmersnotes.info/ - tips, design patterns, client and server-side coding, yii articles and simply my experience.

Follow me on twitter: http://twitter.com/KonstantinMirin
Add me to your friends on facebook: http://www.facebook....hp?id=784832902
0

#3 User is offline   KJedi 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 381
  • Joined: 19-October 08
  • Location:Nikolaev, Ukraine (Europe)

Posted 02 October 2009 - 02:45 AM

сорри, не дочитал пост твой. Поменять домашнюю базу лучше чем ставить такие костыли :)
У меня дома 5.1.37
на сервере 5.1.32
Все ОК и там и там...
дома пхп 5.3, нормально работает (стоит связка XAMPP)
Posted Image
My Blog: http://programmersnotes.info/ - tips, design patterns, client and server-side coding, yii articles and simply my experience.

Follow me on twitter: http://twitter.com/KonstantinMirin
Add me to your friends on facebook: http://www.facebook....hp?id=784832902
0

#4 User is offline   freezy 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 23
  • Joined: 12-August 09
  • Location:Russia, Arzamas

Posted 02 October 2009 - 02:46 AM

$sql = "SELECT menuOrder FROM categories WHERE id = $id ";

Возможно что-то вроде:
$sql = "SELECT menuOrder FROM categories WHERE id = $id LIMIT 1";

0

#5 User is offline   Karasko 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 89
  • Joined: 14-July 09
  • Location:Russia

Posted 02 October 2009 - 05:55 AM

Вообщем это ужасный баг, самый самый дурной баг похоже ))

Искал в инете, то ли библиотека PDO гонит, то ли конкретный драйвер mysql (libmysql ?? ). Хотя вроде 5.3 уже используется нативный драйвер mysqlnd. Это случается только вроде на WIN. На хостинге такого нет )

KJedi способ Yii::app()->db->pdoInstance->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true) - ничего не меняет.

Freezy - limit в конце запроса тоже ни к чему не приводит.

И явное закрытие курсора после SELECT'a тоже не помогает.

Не знаю что делать, поставлю XAMPP оттуда дёрну либы может.
0

#6 User is offline   Karasko 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 89
  • Joined: 14-July 09
  • Location:Russia

Posted 02 October 2009 - 05:31 PM

Боже какая глупость ))
Я в такие дебри залез, что снёс свою установку, ставил новый пхп, теперь XAMPP, и очень удивился когда ошибка повторилась..

А дело в том что я выполняю (execute()) первый селект запрос. Да ещё и потом. А надо было выполнять $sql1, $sql2 соответсвенно )))

тема закрыта
0

#7 User is offline   Dm.Fish 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 1
  • Joined: 14-November 12

Posted 14 November 2012 - 02:45 PM

PDO не поддерживает 2 и более параллельно запущенных запроса.

Повезло, что получилось решить проблему простым способом. Есть ситуации, когда такой подход не работает

Например, в проекте ситуация: Выполняется sql-запрос, по которому должен построится CGridView, в контроллере получаем количество строк, полученных в результате выполнения (CDbDataReader::rowCount), формируется DataProvider. В зависимости от таблицы в DataProvider-е заполняются данные о пагинации (количество записей на одной странице). Проблема была в том, что между выполнением sql-выражения и построением таблицы в представлении выполняется еще несколько sql-выражений для генерации выпадающих списков.

Изначально решалось выгрузкой всех результатов sql-выражения в контроллере на этапе запроса. То есть все результаты запроса загружались в переменную в контроллере, после чего CArrayDataProvider попадал в CGridView. Все работало нормально, пока данных было не очень много, после 20 000 строк, перестало хватать 128мб на 1 клиента.

В итоге решено было следующим образом:
Сделано 2 класса-эмулятора MyPDO и MyPDOStatement. Классы полностью реализовывали функционал PDO и PDOStatement соответственно, но через mysqli и mysqli_result, при помощи mysqli->multi_query решилась проблема параллельного выполнения запросов.

Соответственно в конфиге в секции db добавил свойство 'pdoClass' => 'MyPDO'
---
Если кого-то еще интересует этот вопрос, могу выложить код классов в общий доступ
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users