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

MaksimHelp

Client
Joined
Sep 23, 2016
Messages
213
Reaction score
8
Points
18
Всем привет! У меня такой вопрос, работаю с базой данных, во многопотоке возможно ли такое что потоки могут совпасть и одновременно взять одну и туже строку? Если да, то как этого избежать?
 

one

Client
Joined
Sep 22, 2015
Messages
6,998
Reaction score
1,305
Points
113
Всем привет! У меня такой вопрос, работаю с базой данных, во многопотоке возможно ли такое что потоки могут совпасть и одновременно взять одну и туже строку? Если да, то как этого избежать?
На форуме обсуждался этот момент. Поищите, где то был топик.
 
  • Thank you
Reactions: MaksimHelp

MaksimHelp

Client
Joined
Sep 23, 2016
Messages
213
Reaction score
8
Points
18

Mikhail B.

Client
Joined
Dec 23, 2014
Messages
14,449
Reaction score
5,477
Points
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с Mikhail B. какие-либо сделки.

  • Thank you
Reactions: MaksimHelp

MaksimHelp

Client
Joined
Sep 23, 2016
Messages
213
Reaction score
8
Points
18
Попробуйте завернуть в обычный зеновский лок.
Спасибо за совет, вот как раз таки пробую!
 

one

Client
Joined
Sep 22, 2015
Messages
6,998
Reaction score
1,305
Points
113
Блин, день какой то не такой сегодня... Не могу найти, в конкурсных статьях есть хороший материал про локи.
 

photograph

Client
Joined
Sep 4, 2015
Messages
11
Reaction score
4
Points
3

one

Client
Joined
Sep 22, 2015
Messages
6,998
Reaction score
1,305
Points
113
Нет, в предыдущих конкурсах.
 

doc

Client
Joined
Mar 30, 2012
Messages
8,685
Reaction score
4,652
Points
113
Могут или не могут зависит от логики запросов. Если речь об обычном селекте - могут. Можно использовать транзакции, вторым запросом которй будет апдейт этой строки таким образом, чтобы другой селект её уже не мог взять. Можно без транзакций сначала апдейтить строку, присваивая спец. полю, например, сгенерированный айди, а после по этому айди брать эту строку
 

pym933

Client
Joined
Feb 23, 2016
Messages
26
Reaction score
7
Points
3
Можно без транзакций сначала апдейтить строку, присваивая спец. полю, например, сгенерированный айди, а после по этому айди брать эту строку
Лучше с транзакциями, существует вероятность что одну и туже строку проадейтят более одного потока, между запросами апдейта и последующего селекта.
 

Mikhail B.

Client
Joined
Dec 23, 2014
Messages
14,449
Reaction score
5,477
Points
113

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с Mikhail B. какие-либо сделки.

Лучше с транзакциями, существует вероятность что одну и туже строку проадейтят более одного потока, между запросами апдейта и последующего селекта.
У меня даже с транзациями брал одинаковые строки.
 

doc

Client
Joined
Mar 30, 2012
Messages
8,685
Reaction score
4,652
Points
113
Лучше с транзакциями, существует вероятность что одну и туже строку проадейтят более одного потока, между запросами апдейта и последующего селекта.
если одна проапдейчена, то другой апдейт не сможет взять её по условию того, что поле спец идентификатора уже не пустое
 

specialist

Client
Joined
Dec 28, 2018
Messages
734
Reaction score
343
Points
63
возможно ли такое что потоки могут совпасть и одновременно взять одну и туже строку
1. Запросы на выборку типа select не блокируют таблицу или строку. Будут часто совпадать, часто начиная от 10 потоков.
2. Вначале забираем строку себе, через UPDADE, например в дополнительном столбце ставим UUID, по которому дальше будет делать select.
3. Тип таблицы так же влияет на работу, InnoDB блокирует построчно, MyIsam - всю таблицу.
 

pym933

Client
Joined
Feb 23, 2016
Messages
26
Reaction score
7
Points
3
если одна проапдейчена, то другой апдейт не сможет взять её по условию того, что поле спец идентификатора уже не пустое
Если спец поле выделить, то да.
 

Users Who Are Viewing This Thread (Total: 1, Members: 0, Guests: 1)