Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / одновременное выполнение DDL-инструкций / 14 сообщений из 14, страница 1 из 1
19.12.2018, 15:24
    #39750240
S_Gur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одновременное выполнение DDL-инструкций
Господа специалисты, подскажите, пожалуйста, позволяет ли MySQL одновременное выполнение двух DDL-инструкций на одну таблицу? Например, Alter Table?
...
Рейтинг: 0 / 0
19.12.2018, 15:46
    #39750263
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одновременное выполнение DDL-инструкций
Поясните подробнее, что Вы разумеете под одновременным выполнением.
...
Рейтинг: 0 / 0
19.12.2018, 15:50
    #39750271
S_Gur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одновременное выполнение DDL-инструкций
Akina, в двух словах задача такая. Есть таблица, в которой гарантированно сидит только одна запись. Поскольку инсерты в нее не производятся, я хочу использовать ее для иммитации ораклового сиквенса, используя ее счетчик автоинкремента. То есть, получаю текущее значение, возвращаю его и увеличиваю текущее значение на единицу. Вопрос в том, возможна ли ситуация, когда два процесса, случайно вызвав эту процедуру одновременно, получат одинаковые значения?
...
Рейтинг: 0 / 0
19.12.2018, 16:34
    #39750309
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одновременное выполнение DDL-инструкций
А тогда при чём тут DDL? нафига тут ALTER TABLE? изменение данных - это UPDATE, чистый DML.

S_Gurвозможна ли ситуация, когда два процесса, случайно вызвав эту процедуру одновременно, получат одинаковые значения?Да, возможна, если не принять соответствующих мер (SELECT .. FOR UPDATE).
...
Рейтинг: 0 / 0
19.12.2018, 16:38
    #39750313
S_Gur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одновременное выполнение DDL-инструкций
Akina, ALTER TABLE tbl AUTO_INCREMENT = 100 - это чистый DDL
...
Рейтинг: 0 / 0
19.12.2018, 16:41
    #39750318
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одновременное выполнение DDL-инструкций
S_GurALTER TABLE tbl AUTO_INCREMENT = 100Этот запрос НИЧЕГО не меняет. Он изменяет только значение, которое будет присвоено автоинкременту НОВОЙ записи, если значение этому полю не задаётся явно. А у тебя в таблице всегда одна запись, и "инсерты в неё не производятся" - так что запрос получается чуть более чем бессмысленный.
...
Рейтинг: 0 / 0
19.12.2018, 16:47
    #39750326
S_Gur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одновременное выполнение DDL-инструкций
Akina, в этом и смысл. Данные не меняются, меняется только текущее значение AUTO_INCREMENT для этой таблицы. Я процедуру уже написал, она прекрасно работает. Вот только не могу понять, какие подводные камни будут при одновременном вызове процедуры несколькими процессами
...
Рейтинг: 0 / 0
19.12.2018, 16:49
    #39750328
S_Gur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одновременное выполнение DDL-инструкций
Получилось что-то типа этого

Create Procedure `prGenTmpNumID`
(Out pTmpNumID BigInt Unsigned,
Out pResult TinyInt)

Comment 'Генерация уникального номера'

Begin

# По умолчанию ошибки нет

Set pResult = 0;

# Возвращаем текущее значение

Select
`auto_increment`
Into
pTmpNumID
From
information_schema.tables
Where
table_schema = '[dbname]'
And table_name = '[tablename]';

# Генерируем новое значение

Call `prRunDynQuery`
(Concat('Alter Table `[tablename]` AUTO_INCREMENT = ', pTmpNumID + 1),
pResult);

End;;

Delimiter ;
...
Рейтинг: 0 / 0
19.12.2018, 18:36
    #39750424
Karbafos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одновременное выполнение DDL-инструкций
S_Gur,

Между селектом и альтером влезет вагон других потоков, которые успеют сделать селект, а потом и альтер, и все на одно и то же значение.
Кто вообще это придумал, делать сиквенс на обновлении схемы, а не данных?
...
Рейтинг: 0 / 0
19.12.2018, 19:42
    #39750445
S_Gur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одновременное выполнение DDL-инструкций
Karbafos, да, я уже понял. Это был просто эксперимент, не хотелось сначала добавлять записи, а потом удалять их, надеялся обойтись без этого. Я сначала думал делать альтер перед селектом и была надежда, что два потока не могут одновременно делать альтер на одну и ту же таблицу, поэтому второй альтер будет ждать окончания первого. Потом понял, что так не получится - чтобы сделать альтер, надо сперва получить текущее значение. Построить сиквенс на данных вряд ли будет проще, именно из за удаления добавляемых данных. Но видимо, все-таки, правильнее... Вопрос закрыт, всем спасибо
...
Рейтинг: 0 / 0
19.12.2018, 20:13
    #39750454
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одновременное выполнение DDL-инструкций
S_GurПостроить сиквенс на данных вряд ли будет проще, именно из за удаления добавляемых данных.Только удаляйте не все записи, а кроме последней. А то счет однажды внезапно может пойти сначала.
...
Рейтинг: 0 / 0
19.12.2018, 20:45
    #39750469
S_Gur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одновременное выполнение DDL-инструкций
miksoft, спасибо, учту
...
Рейтинг: 0 / 0
19.12.2018, 20:49
    #39750473
Karbafos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одновременное выполнение DDL-инструкций
S_Gurне хотелось сначала добавлять записи, а потом удалять их

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html

CREATE TABLE `seq_global` (
`value` bigint(20) unsigned AUTO_INCREMENT NOT NULL,
`increment` int(11) NOT NULL,
PRIMARY KEY `i_seqkey`(`value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

update `seq_global` set value=last_insert_id(value+increment);
select last_insert_id();

атомарно и без удалений, если юзать MyISAM, то можно в одной таблице держать несколько сиквенсов, т.к. MyISAM позволяет сделать PRIMARY KEY(seq_name, value)
...
Рейтинг: 0 / 0
19.12.2018, 21:25
    #39750487
S_Gur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
одновременное выполнение DDL-инструкций
Karbafos, спасибо большое. То, что нужно
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / одновременное выполнение DDL-инструкций / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]