|
|
|
Объясните про транзакции
|
|||
|---|---|---|---|
|
#18+
Есть такие запросы (делаю через php): Код: sql 1. 2. 3. 4. 5. 6. 7. Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. На php скрипт идет по 5 запросов в секунду. Очевидно, что происходят коллизии, т.е 2 разным пользователям select выдает пересекающиеся строки, затем в UPDATE хеш второго пользователя затирает первого, и первый делает лишнюю работу (так как при не совпадении хеша в дальнейшем результат откинется). Вот такой велосипед. Подскажите, как сделать по-нормальному? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2016, 20:18 |
|
||
|
Объясните про транзакции
|
|||
|---|---|---|---|
|
#18+
dart_sitius, Код: sql 1. 2. 3. Только учтите, что LIMIT без ORDER BY - рулетка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2016, 20:40 |
|
||
|
Объясните про транзакции
|
|||
|---|---|---|---|
|
#18+
miksoft, спасибо. Только мне еще данные из SELECT нужно вывести на экран. Насчет order by - не страшно, что рулетка, главное, чтобы быстро работало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2016, 20:43 |
|
||
|
Объясните про транзакции
|
|||
|---|---|---|---|
|
#18+
miksoft, Думаю, может сменить myisam на innodb и к SELECT просто в конце добавить FOR UPDATE ? Тогда вроде бы это будет единой транзакцией, сильно ли замедлится работа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2016, 20:44 |
|
||
|
Объясните про транзакции
|
|||
|---|---|---|---|
|
#18+
Хм, нет, не так. Не обратил внимание, что таблица одна и та же. Тогда так: Код: sql 1. 2. 3. А вывести потом можно с помощью этого: Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2016, 20:45 |
|
||
|
Объясните про транзакции
|
|||
|---|---|---|---|
|
#18+
dart_sitiusДумаю, может сменить myisam на innodbЕсли у вас сейчас MyISAM, то никаких транзакций у вас нет, он их не поддерживает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2016, 20:47 |
|
||
|
Объясните про транзакции
|
|||
|---|---|---|---|
|
#18+
miksoft, вывод по hash не подходит, потому что в таблице очень много строк с одинаковыми хешами. Мне нужно вывести только те строки, которые выданы в данной транзакции, т.е только эти айдишники ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2016, 20:47 |
|
||
|
Объясните про транзакции
|
|||
|---|---|---|---|
|
#18+
dart_sitiusМне нужно вывести только те строки, которые выданы в данной транзакции, т.е только эти айдишникиТогда остается только ваш изначальный вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2016, 20:49 |
|
||
|
Объясните про транзакции
|
|||
|---|---|---|---|
|
#18+
miksoft, ну а если изменить на innodb? как будет выглядеть вариант с транзакциями? Мне нужно что-то типа критической секции, желательно построчно (чтобы быстрее работало). Идеально было бы, если бы первый пользователь сделал SELECT, и эти строки "скрылись" от других пользователей, пока не будет сделан update. А другие пользователи тем временем не ждали, а просто получили в SELECT другие строки. Такое возможно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2016, 21:03 |
|
||
|
Объясните про транзакции
|
|||
|---|---|---|---|
|
#18+
dart_sitius, Можно, если добавить поле-метку текущей "партии" (или сессии). "Захват": Код: sql 1. 2. 3. (CONNECTION_ID() - плохой вариант, т.к. уникальность гарантируется только для каждого отдельно взятого момента времени, но не в интервале времени) Выборка остальных полей: Код: sql 1. "Освобождение": Код: sql 1. Будет нужен индекс по полю current_session. И нужно предусмотреть механизм "освобождения" записей досрочно умершими сессиями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2016, 21:24 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=88&tid=1831241]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 351ms |

| 0 / 0 |
