evpu
25-02-2019, 10:16
Добрый день!
Оптимизирую код, вычищал места где запросы проходят не атомарно.
К примеру, есть основная таблица аккаунтов, есть гостевая. Переделываю в связи с ОЧЕНЬ большим количеством параллельных потоков, и высокой вероятностью обращения к одному иденту из разных потоков.
UPDATE main_acc SET balance=(balance-"tarif") WHERE id="XXXX" //это главная таблица
UPDATE guest_acc SET balance = (SELECT balance FROM main_acc WHERE id="XXXX" LIMIT 1 FOR UPDATE) WHERE main_id="XXXX" //это "альтернативные локации"
Тарификация, короче.
Было иначе, сначала считывал, потом обновлял.
И тут возник вопрос, а что будет, если другой поток спросит SELECT id FROM main_acc WHERE hex_ident="HEX" - к слову, поле hex_ident не является первичным, но является уникальным.
Если строка в этот момент будет в блокировке, то что произойдет? Будет ждать освобождения строки, надеюсь???
Т.е если под критерий SELECT...WHERE попадают строки находящиеся в блокировке, они не исключаются из выборки? А то чревато ложным появлением ситуации "account not found" со всеми вытекающими прискорбными последствиями
Оптимизирую код, вычищал места где запросы проходят не атомарно.
К примеру, есть основная таблица аккаунтов, есть гостевая. Переделываю в связи с ОЧЕНЬ большим количеством параллельных потоков, и высокой вероятностью обращения к одному иденту из разных потоков.
UPDATE main_acc SET balance=(balance-"tarif") WHERE id="XXXX" //это главная таблица
UPDATE guest_acc SET balance = (SELECT balance FROM main_acc WHERE id="XXXX" LIMIT 1 FOR UPDATE) WHERE main_id="XXXX" //это "альтернативные локации"
Тарификация, короче.
Было иначе, сначала считывал, потом обновлял.
И тут возник вопрос, а что будет, если другой поток спросит SELECT id FROM main_acc WHERE hex_ident="HEX" - к слову, поле hex_ident не является первичным, но является уникальным.
Если строка в этот момент будет в блокировке, то что произойдет? Будет ждать освобождения строки, надеюсь???
Т.е если под критерий SELECT...WHERE попадают строки находящиеся в блокировке, они не исключаются из выборки? А то чревато ложным появлением ситуации "account not found" со всеми вытекающими прискорбными последствиями