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

MaksimHelp

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

one

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

MaksimHelp

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

Mikhail B.

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

MaksimHelp

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

one

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

photograph

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

one

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

doc

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

pym933

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

Mikhail B.

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

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
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
если одна проапдейчена, то другой апдейт не сможет взять её по условию того, что поле спец идентификатора уже не пустое
Если спец поле выделить, то да.
 

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