О многопоточности бд!

MaksimHelp

Client
Регистрация
23.09.2016
Сообщения
193
Благодарностей
6
Баллы
18
Всем привет! У меня такой вопрос, работаю с базой данных, во многопотоке возможно ли такое что потоки могут совпасть и одновременно взять одну и туже строку? Если да, то как этого избежать?
 

one

Client
Регистрация
22.09.2015
Сообщения
6 793
Благодарностей
1 264
Баллы
113
Всем привет! У меня такой вопрос, работаю с базой данных, во многопотоке возможно ли такое что потоки могут совпасть и одновременно взять одну и туже строку? Если да, то как этого избежать?
На форуме обсуждался этот момент. Поищите, где то был топик.
 
  • Спасибо
Реакции: MaksimHelp

MaksimHelp

Client
Регистрация
23.09.2016
Сообщения
193
Благодарностей
6
Баллы
18

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
  • Спасибо
Реакции: MaksimHelp

MaksimHelp

Client
Регистрация
23.09.2016
Сообщения
193
Благодарностей
6
Баллы
18

one

Client
Регистрация
22.09.2015
Сообщения
6 793
Благодарностей
1 264
Баллы
113
Блин, день какой то не такой сегодня... Не могу найти, в конкурсных статьях есть хороший материал про локи.
 

photograph

Client
Регистрация
04.09.2015
Сообщения
11
Благодарностей
4
Баллы
3

one

Client
Регистрация
22.09.2015
Сообщения
6 793
Благодарностей
1 264
Баллы
113
Нет, в предыдущих конкурсах.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 599
Баллы
113
Могут или не могут зависит от логики запросов. Если речь об обычном селекте - могут. Можно использовать транзакции, вторым запросом которй будет апдейт этой строки таким образом, чтобы другой селект её уже не мог взять. Можно без транзакций сначала апдейтить строку, присваивая спец. полю, например, сгенерированный айди, а после по этому айди брать эту строку
 

pym933

Client
Регистрация
23.02.2016
Сообщения
24
Благодарностей
7
Баллы
3
Можно без транзакций сначала апдейтить строку, присваивая спец. полю, например, сгенерированный айди, а после по этому айди брать эту строку
Лучше с транзакциями, существует вероятность что одну и туже строку проадейтят более одного потока, между запросами апдейта и последующего селекта.
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Лучше с транзакциями, существует вероятность что одну и туже строку проадейтят более одного потока, между запросами апдейта и последующего селекта.
У меня даже с транзациями брал одинаковые строки.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 599
Баллы
113
Лучше с транзакциями, существует вероятность что одну и туже строку проадейтят более одного потока, между запросами апдейта и последующего селекта.
если одна проапдейчена, то другой апдейт не сможет взять её по условию того, что поле спец идентификатора уже не пустое
 

specialist

Client
Регистрация
28.12.2018
Сообщения
732
Благодарностей
343
Баллы
63
возможно ли такое что потоки могут совпасть и одновременно взять одну и туже строку
1. Запросы на выборку типа select не блокируют таблицу или строку. Будут часто совпадать, часто начиная от 10 потоков.
2. Вначале забираем строку себе, через UPDADE, например в дополнительном столбце ставим UUID, по которому дальше будет делать select.
3. Тип таблицы так же влияет на работу, InnoDB блокирует построчно, MyIsam - всю таблицу.
 

pym933

Client
Регистрация
23.02.2016
Сообщения
24
Благодарностей
7
Баллы
3
если одна проапдейчена, то другой апдейт не сможет взять её по условию того, что поле спец идентификатора уже не пустое
Если спец поле выделить, то да.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)