LINUX.ORG.RU

mysq, два подключения, выборка и изменение на лету


0

0

Приветствую.

Есть два подключения к базе данных. Первое используется для забора данных:

SELECT time, value FROM `table` WHERE time <= 1268409464 AND time >= 0 ORDER BY time LIMIT 86400

Второе для изменений

UPDATE `table` SET value=1.1 WHERE time=919462145

Т.е. хочется реализовать такой алгоритм: while (has rows) { fetch_row(connection #1); change_row(connection #2, value); }

Исползуя MyISAM тип базы данных, забор данных просто тихо прекращается. Используя InnoDB получаю «The total number of locks exceeds the lock tables».

> show full processlist;

| Id  | User           | Host                 | db      | Command | Time | State          | Info 
| 109 | user            | ip:39753 | database | Query   |    6 | Locked         | UPDATE EUR_USD SET value=1.126700 WHERE time=918252890                                                            |
| 110 | user            | ip:39754 | database | Query   |    6 | Writing to net | SELECT time, value FROM  `table` WHERE time <= 1268433749 AND time >=  918047320 ORDER BY time LIMIT 86400 |

Такая ситуация происходит если подключатся к серверу, запущенному на той же машине(вне зависимости от типа подключения tcp/unix socket). При удаленном подключении все работает корректно. Судя по processlist, mysql блокирует исполнение UPDATE запроса при локальном подключении.

Подскажите, в чем моя ошибка, что почитать?

--- Program language: C [gcc version 4.4.3 20100108] MySQL: Ver 14.14 Distrib 5.1.41, for linux-gnu (i486) using readline 6.1



Последнее исправление: andreyse (всего исправлений: 1)

В mysql разве нельзя сделать select, идти по возвращённому result set-у и на ходу его изменять, без вызова update-ов?

А так понятно почему, 2 транзакции, они должны быть независимы друг от друга, вот и лочат строки. Если хочется вариант с двумя соединениями оставить (хотя не представляю зачем), поставьте самый либеральный уровень изоляции транзакций.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

> В mysql разве нельзя сделать select, идти по возвращённому result set-у и на ходу его изменять, без вызова update-ов?

Подробнее, пожалуйста.

andreyse
() автор топика
Ответ на: комментарий от andreyse

Ну в джаве в JDBC можно сделать select, получить ResultSet, и идя по нему изменять те данные которые он вернул. Полагаю, в биндингах к С такая возможность тоже должна быть.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

> Ну в джаве в JDBC можно сделать select, получить ResultSet, и идя по нему изменять те данные которые он вернул.

Вы действительно думаете что java не вызывает Update? Просто интересно :)

anonymous
()
Ответ на: комментарий от anonymous

Траффик не снифал, не знаю. Понятно, что можно это делать, генерируя апдейты, но раз эта возможность в JDBC есть, значит есть драйверы, которые её поддерживают на уровне протоколов.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Впрочем в libmysql такого не нашёл, можно всё что я сказал проигнорировать )

Legioner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.