SELECT и UPDATE одним запросом
От: Volgare  
Дата: 14.12.17 08:55
Оценка:
Есть таблица с кейвордами и ссылками. На каждый кейворд 30-50 ссылок.
Нужно забрать по заданному кейворду все ссылки, но при этом отметить, что они забраны.
Делаю двумя последовательными запросами.
SELECT url FROM links WHERE post = '0' AND keywords = 'key';
UPDATE links SET post='1' WHERE keywords = 'key';


Но если в многопотоке, то возникают накладки, ключ берут сразу несколько потоков в паузе между запросами SELECT и UPDATE.
Советуют сделать по этому методу http://www.sqlines.com/mysql/how-to/select-update-single-statement-race-condition
но не врублюсь как мне переписать мои запросы?
Re: SELECT и UPDATE одним запросом
От: vmpire Россия  
Дата: 14.12.17 09:00
Оценка: 6 (1)
Здравствуйте, Volgare, Вы писали:

V>Нужно забрать по заданному кейворду все ссылки, но при этом отметить, что они забраны.

V>Делаю двумя последовательными запросами.
V>
V>SELECT url FROM links WHERE post = '0' AND keywords = 'key';
V>UPDATE links SET post='1' WHERE keywords = 'key';
V>


V>Но если в многопотоке, то возникают накладки, ключ берут сразу несколько потоков в паузе между запросами SELECT и UPDATE.

V>Советуют сделать по этому методу http://www.sqlines.com/mysql/how-to/select-update-single-statement-race-condition
V>но не врублюсь как мне переписать мои запросы?
Используете конструкцию OUTPUT (https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql)
Ну или в одной транзакции сначала UPDATE, потом SELECT.
Re: SELECT и UPDATE одним запросом
От: Alex.Che  
Дата: 14.12.17 09:09
Оценка: +1
читайте про
[src]select ... for update with lock[/src]
и
[src]select ... with lock[/src]

--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: SELECT и UPDATE одним запросом
От: Volgare  
Дата: 14.12.17 09:17
Оценка:
Здравствуйте, vmpire, Вы писали:
V>Ну или в одной транзакции сначала UPDATE, потом SELECT.
Я пытаюсь так
UPDATE links SET post='1' WHERE url in 
(SELECT url FROM links WHERE post = '0' AND keywords = 'key');

Но лезет ошибка.
Проблема в том, что я ещё работаю с mySQL через специфичный C# софт
Re[3]: SELECT и UPDATE одним запросом
От: vmpire Россия  
Дата: 14.12.17 09:42
Оценка:
Здравствуйте, Volgare, Вы писали:

V>Я пытаюсь так

V>
V>UPDATE links SET post='1' WHERE url in 
V>(SELECT url FROM links WHERE post = '0' AND keywords = 'key');
V>

V>Но лезет ошибка.
какая?

V>Проблема в том, что я ещё работаю с mySQL через специфичный C# софт

Ну так нужно было с этого начинать
Как это делается в mySQL — я, к сожалению, не в курсе.
Re: SELECT и UPDATE одним запросом
От: Слава  
Дата: 14.12.17 10:14
Оценка:
Здравствуйте, Volgare, Вы писали:

V>Но если в многопотоке, то возникают накладки, ключ берут сразу несколько потоков в паузе между запросами SELECT и UPDATE.

V>Советуют сделать по этому методу http://www.sqlines.com/mysql/how-to/select-update-single-statement-race-condition
V>но не врублюсь как мне переписать мои запросы?

Если в MySql к 2017 году таки завезли транзакции, то сделать это можно хоть двумя, хоть десятью запросами — в рамках одной транзакции. А особо специфичный софт между вашей программой и БД надо просто убрать, если он не позволяет просто отправлять запросы.
Re[3]: SELECT и UPDATE одним запросом
От: VladCore  
Дата: 14.12.17 15:51
Оценка: +1
V>Я пытаюсь так
V>
V>UPDATE links SET post='1' WHERE url in 
V>(SELECT url FROM links WHERE post = '0' AND keywords = 'key');
V>


На вид этот update ничего кроме кол-ва обновленных строк не вернет.

Вам правильно посоветовали Select ... For Update;
MySQL умеет Select For Update — конкурентные читатели первого Select не начнут читать и будут ждать пока не отработает второй Update:

START TRANSACTION;
SELECT url FROM links WHERE post = '0' AND keywords = 'key' for update;
UPDATE links SET post='1' WHERE keywords = 'key';
COMMIT;


пробовали?
Отредактировано 14.12.2017 16:02 VladCore . Предыдущая версия . Еще …
Отредактировано 14.12.2017 15:54 VladCore . Предыдущая версия .
Отредактировано 14.12.2017 15:52 VladCore . Предыдущая версия .
Re: SELECT и UPDATE одним запросом
От: amironov79  
Дата: 15.12.17 05:31
Оценка:
Здравствуйте, Volgare, Вы писали:

V>Но если в многопотоке, то возникают накладки, ключ берут сразу несколько потоков в паузе между запросами SELECT и UPDATE.


В некоторых СУБД (Postgres, Oracle) есть возможность через RETURNING получить строки из UPDATE. То есть можно обойтись одним UPDATE.
Re[2]: SELECT и UPDATE одним запросом
От: amironov79  
Дата: 15.12.17 06:40
Оценка:
Здравствуйте, amironov79, Вы писали:

A>В некоторых СУБД (Postgres, Oracle) есть возможность через RETURNING получить строки из UPDATE. То есть можно обойтись одним UPDATE.


Да, по блокировкам этот вариант не будет отличаться от варианта с FOR UPDATE, соседний транзакция будет блокироваться на UPDATE, пока не завершится текущая.
Re: SELECT и UPDATE одним запросом
От: MasterZiv СССР  
Дата: 21.12.17 13:54
Оценка:
Здравствуйте, Volgare, Вы писали:

V>Есть таблица с кейвордами и ссылками. На каждый кейворд 30-50 ссылок.

V>Нужно забрать по заданному кейворду все ссылки, но при этом отметить, что они забраны.
V>Делаю двумя последовательными запросами.
V>
V>SELECT url FROM links WHERE post = '0' AND keywords = 'key';
V>UPDATE links SET post='1' WHERE keywords = 'key';
V>


V>Но если в многопотоке, то возникают накладки, ключ берут сразу несколько потоков в паузе между запросами SELECT и UPDATE.

V>Советуют сделать по этому методу http://www.sqlines.com/mysql/how-to/select-update-single-statement-race-condition
V>но не врублюсь как мне переписать мои запросы?

begin transaction

select ... for update ...;

update ...

commit;
Re[4]: SELECT и UPDATE одним запросом
От: Volgare  
Дата: 21.12.17 14:18
Оценка:
А вот ещё такая задачка
Нужно сделать SELECT keywords FROM links WHERE post = '0';
но при этом взять, скажем, только 100 первых рядов удовлетворяющих условию post = '0' и из этих 100 взять только 1 случайный ряд.
И всё это одним запросом.
Вот такое необычное желание))
Re[5]: SELECT и UPDATE одним запросом
От: Alex.Che  
Дата: 21.12.17 14:31
Оценка:
21.12.2017 17:18, Volgare пишет:
> А вот ещё такая задачка

зачёты близятся
а Германа всё нет...

©
Posted via RSDN NNTP Server 2.1 beta
Re[6]: SELECT и UPDATE одним запросом
От: Volgare  
Дата: 21.12.17 14:40
Оценка:
Здравствуйте, Alex.Che, Вы писали:

AC>21.12.2017 17:18, Volgare пишет:

>> А вот ещё такая задачка

AC>зачёты близятся

AC>а Германа всё нет...

AC>©

Ошибаетесь))
Просто с БД не приходилось плотно работать.
А зачеты 20 лет уже как не актуальны.
Re[7]: SELECT и UPDATE одним запросом
От: Alex.Che  
Дата: 21.12.17 14:49
Оценка: -1
21.12.2017 17:40, Volgare пишет:
> Просто с БД не приходилось плотно работать.

раз уж пришлось, видимо стоИт начать с азов SQL.

https://msdn.microsoft.com/ru-ru/library/ms189463%28v=sql.120%29.aspx
Posted via RSDN NNTP Server 2.1 beta
Re[8]: SELECT и UPDATE одним запросом
От: Слава  
Дата: 21.12.17 17:46
Оценка:
Здравствуйте, Alex.Che, Вы писали:

AC>раз уж пришлось, видимо стоИт начать с азов SQL.

AC>https://msdn.microsoft.com/ru-ru/library/ms189463%28v=sql.120%29.aspx

У топикстартера мыскль. Он каличный и ничего в нём нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.