SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 18.09.2011 20:16:47

demiurg
Завсегдатай
Зарегистрирован: 08.05.2011
Сообщений: 46

Использование MySQL в многопоточных приложениях

подскажите не может ли быть "пересечения" данных из разных потоков при одновременной вставке и обновления в таблицу.

Что лучше использовать InnoDb или MyISAM при таких характеристиках структуры -объём базы около 1Gb , кол-во подключений из потоков - 1-2 сотни(теоретически, практически - десяток-два) , время подключения - 20-30 секунд, структура - 2 таблицы  - одна обновляется , в другую добавляется.

Неактивен

 

#2 18.09.2011 20:25:39

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Использование MySQL в многопоточных приложениях

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

Неактивен

 

#3 18.09.2011 20:45:44

demiurg
Завсегдатай
Зарегистрирован: 08.05.2011
Сообщений: 46

Re: Использование MySQL в многопоточных приложениях

Ну последовательность такова - в базе данных две таблицы - 1я содержит идентификаторы и обновляемые данные 2я представляет собой хранилище данных. Приложение считывает идентификатор и обновляет данные в 1 таблице, после чего вписывает данные во 2 таблицу с идентификатором из первой таблицы. Таких приложений( точнее потоков в приложении , одновременно выполняющих эту последовательность может быть пару сотен). Приложение и БД находится на одном и том же ПК. Перечечение всмысле -  не могут ли данные из разных подключений смешаться и одновременно важно  - надо ли блокировать для этого таблицы?

Неактивен

 

#4 18.09.2011 20:53:16

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Использование MySQL в многопоточных приложениях

Вы написали не все. Напишите более точно последовательность запросов:

SELECT FROM 1;
INSERT INTO 2;
DELETE FROM 1;


Так?
Данные смешаться не могут. Но несколько потоков, выполняясь одновременно могут взять одну и ту же строчку из таблицы 1 - чтобы такого не произошло, используйте транзакции.

Неактивен

 

#5 18.09.2011 20:59:38

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Использование MySQL в многопоточных приложениях

Зависит от того, что за данные вы обновляете, как вы обновляете и что подразумевается
под «смешаться». Если блокировать таблицы, то потоки смогут работать только последова-
тельно. Если работать параллельно, то потоки будут видеть те или иные данные в зависи-
мости от уровня изоляции транзакции (если выбрано хранилище InnoDB).

Неактивен

 

#6 18.09.2011 21:30:44

demiurg
Завсегдатай
Зарегистрирован: 08.05.2011
Сообщений: 46

Re: Использование MySQL в многопоточных приложениях

Две таблицы


mysql> show columns from device;
+------------+------------------------+------+-----+---------+----------------+
| Field      | Type                   | Null | Key | Default | Extra          |
+------------+------------------------+------+-----+---------+----------------+
| id         | mediumint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| Pnum       | varchar(20)            | YES  | MUL | NULL    |                |
| IMEI       | varchar(20)            | YES  |     | NULL    |                |
| batt       | varchar(6)             | YES  |     | NULL    |                |
| simnumber  | varchar(15)            | YES  |     | NULL    |                |
| money      | varchar(8)             | YES  |     | NULL    |                |
| gsm_signal | varchar(8)             | YES  |     | NULL    |                |
+------------+------------------------+------+-----+---------+----------------+

mysql> show columns from information;
+-------------+------------------------+------+-----+---------+-------+
| Field       | Type                   | Null | Key | Default | Extra |
+-------------+------------------------+------+-----+---------+-------+
| device_id   | mediumint(20) unsigned | NO   | MUL | NULL    |       |
| DT          | datetime               | YES  |     | NULL    |       |
| type        | varchar(8)             | YES  |     | NULL    |       |
| Snum        | varchar(16)            | YES  |     | NULL    |       |
| work_hours  | varchar(12)            | YES  |     | NULL    |       |
| energy      | varchar(16)            | YES  |     | NULL    |       |
| vol1        | varchar(16)            | YES  |     | NULL    |       |
| vol2        | varchar(16)            | YES  |     | NULL    |       |
| consumption | varchar(10)            | YES  |     | NULL    |       |
| temp1       | varchar(10)            | YES  |     | NULL    |       |
| temp2       | varchar(10)            | YES  |     | NULL    |       |
| error       | varchar(8)             | YES  |     | NULL    |       |
+-------------+------------------------+------+-----+---------+-------+

Таблицы связаны полями id и device_id.
1) Подключается клиент запрашивает данные Pnum и IMEI и id  из device/
2) если таковые существуют проверяются на соответствие и если совпадают, то в  строке с id обновляются остальные данные.
3) Вставляются данные в таблицу information с device_id=id ( строк 20 -40 номинально, в редких случаях до 500 строк)

Неактивен

 

#7 18.09.2011 21:33:12

demiurg
Завсегдатай
Зарегистрирован: 08.05.2011
Сообщений: 46

Re: Использование MySQL в многопоточных приложениях

Вот такие запросы делаю
"SELECT id FROM DEVICE WHERE Pnum=%1 AND IMEI=%2"
UPDATE DEVICE SET batt=:batt,simnumber=:simnumber,money=:money,gsm_signal=:gsm_signal WHERE id=:id"

"INSERT INTO information(device_id,DT,type,Snum,work_hours,energy,vol1,vol2,consumption,temp1,temp2,error) VALUES( :device_id,: DT,:type,:Snum,:work_hours,:energy,:vol1,:vol2,:consumption,:temp1,:temp2,:error)"

Отредактированно demiurg (18.09.2011 21:34:06)

Неактивен

 

#8 20.09.2011 21:15:16

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Использование MySQL в многопоточных приложениях

Если возможны одновременные обращения к одним и тем же строкам первой таблицы, то SELECT и UPDATE нужно делать в транзакции.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson