|
одновременное выполнение DDL-инструкций
|
|||
---|---|---|---|
#18+
Господа специалисты, подскажите, пожалуйста, позволяет ли MySQL одновременное выполнение двух DDL-инструкций на одну таблицу? Например, Alter Table? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2018, 15:24 |
|
одновременное выполнение DDL-инструкций
|
|||
---|---|---|---|
#18+
Поясните подробнее, что Вы разумеете под одновременным выполнением. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2018, 15:46 |
|
одновременное выполнение DDL-инструкций
|
|||
---|---|---|---|
#18+
Akina, в двух словах задача такая. Есть таблица, в которой гарантированно сидит только одна запись. Поскольку инсерты в нее не производятся, я хочу использовать ее для иммитации ораклового сиквенса, используя ее счетчик автоинкремента. То есть, получаю текущее значение, возвращаю его и увеличиваю текущее значение на единицу. Вопрос в том, возможна ли ситуация, когда два процесса, случайно вызвав эту процедуру одновременно, получат одинаковые значения? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2018, 15:50 |
|
одновременное выполнение DDL-инструкций
|
|||
---|---|---|---|
#18+
А тогда при чём тут DDL? нафига тут ALTER TABLE? изменение данных - это UPDATE, чистый DML. S_Gurвозможна ли ситуация, когда два процесса, случайно вызвав эту процедуру одновременно, получат одинаковые значения?Да, возможна, если не принять соответствующих мер (SELECT .. FOR UPDATE). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2018, 16:34 |
|
одновременное выполнение DDL-инструкций
|
|||
---|---|---|---|
#18+
Akina, ALTER TABLE tbl AUTO_INCREMENT = 100 - это чистый DDL ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2018, 16:38 |
|
одновременное выполнение DDL-инструкций
|
|||
---|---|---|---|
#18+
S_GurALTER TABLE tbl AUTO_INCREMENT = 100Этот запрос НИЧЕГО не меняет. Он изменяет только значение, которое будет присвоено автоинкременту НОВОЙ записи, если значение этому полю не задаётся явно. А у тебя в таблице всегда одна запись, и "инсерты в неё не производятся" - так что запрос получается чуть более чем бессмысленный. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2018, 16:41 |
|
одновременное выполнение DDL-инструкций
|
|||
---|---|---|---|
#18+
Akina, в этом и смысл. Данные не меняются, меняется только текущее значение AUTO_INCREMENT для этой таблицы. Я процедуру уже написал, она прекрасно работает. Вот только не могу понять, какие подводные камни будут при одновременном вызове процедуры несколькими процессами ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2018, 16:47 |
|
одновременное выполнение DDL-инструкций
|
|||
---|---|---|---|
#18+
Получилось что-то типа этого 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 ; ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2018, 16:49 |
|
одновременное выполнение DDL-инструкций
|
|||
---|---|---|---|
#18+
S_Gur, Между селектом и альтером влезет вагон других потоков, которые успеют сделать селект, а потом и альтер, и все на одно и то же значение. Кто вообще это придумал, делать сиквенс на обновлении схемы, а не данных? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2018, 18:36 |
|
одновременное выполнение DDL-инструкций
|
|||
---|---|---|---|
#18+
Karbafos, да, я уже понял. Это был просто эксперимент, не хотелось сначала добавлять записи, а потом удалять их, надеялся обойтись без этого. Я сначала думал делать альтер перед селектом и была надежда, что два потока не могут одновременно делать альтер на одну и ту же таблицу, поэтому второй альтер будет ждать окончания первого. Потом понял, что так не получится - чтобы сделать альтер, надо сперва получить текущее значение. Построить сиквенс на данных вряд ли будет проще, именно из за удаления добавляемых данных. Но видимо, все-таки, правильнее... Вопрос закрыт, всем спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2018, 19:42 |
|
одновременное выполнение DDL-инструкций
|
|||
---|---|---|---|
#18+
S_GurПостроить сиквенс на данных вряд ли будет проще, именно из за удаления добавляемых данных.Только удаляйте не все записи, а кроме последней. А то счет однажды внезапно может пойти сначала. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2018, 20:13 |
|
одновременное выполнение DDL-инструкций
|
|||
---|---|---|---|
#18+
miksoft, спасибо, учту ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2018, 20:45 |
|
одновременное выполнение DDL-инструкций
|
|||
---|---|---|---|
#18+
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) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2018, 20:49 |
|
|
start [/forum/topic.php?fid=47&tid=1829408]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
142ms |
get topic data: |
11ms |
get forum data: |
4ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 290ms |
total: | 528ms |
0 / 0 |