powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / mysql и transactions
5 сообщений из 5, страница 1 из 1
mysql и transactions
    #33262979
human2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица t1 типа
CREATE TABLE t1 (id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (id));
в нее нужно добалять записи.

И есть таблица t2 типа(max_id
CREATE TABLE t2 (max_id INT);
которая содержит только одну запись - максимальный id в таблице t1.

Структуру таблиц и принцип работы менять нельзя.
Задача: написать запрос атомарно добаляющий одну запись в таблицу t1
и изменяющий запись в таблице t2. Что то типа того:

BEGIN;
INSERT INTO t1 (id) VALUES (null);
UPDATE t2 SET max_id=LAST_INSERT_ID();
COMMIT;

В случае если проходят две параллельных транзакции, первая выполнила begin/insert, тут полностью отработала вторая и первая выполнила update/commit, то таблица t2 будет содержать не максимальный id.

Вопрос как это можно побороть ?!!
С LOCK TABLES ничерта не получается, если до begin заблокировать таблицу t2, то такое впечатление что begin снимает блокировку...
...
Рейтинг: 0 / 0
mysql и transactions
    #33262990
human2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PS: имел ввиду "если до begin заблокировать таблицу t1"...

Получается блокировать только в такой последовательности:

BEGIN;
LOCK TABLES t1 write, t2 write;
INSERT INTO t1 (id) VALUES (null);
UPDATE t2 SET max_id=LAST_INSERT_ID();
COMMIT;
UNLOCK TABLES;

Но это imho извращение какое-то :(

Кто что скажет ?
...
Рейтинг: 0 / 0
mysql и transactions
    #33263016
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
UPDATE t2 SET max_id=LAST_INSERT_ID() WHERE max_id<LAST_INSERT_ID();
?)
...
Рейтинг: 0 / 0
mysql и transactions
    #33263019
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По крайней мере, это более адекватная подпорка, чем блокировать почём зря таблицы в надежде словить дэдлок. Либо вы не объяснили внятно, что вам нужно получить.
...
Рейтинг: 0 / 0
mysql и transactions
    #33263032
human2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DocAl
Код: plaintext
1.
UPDATE t2 SET max_id=LAST_INSERT_ID() WHERE max_id<LAST_INSERT_ID();
?)

Черт ! Как все просто :)
Я уже переделал дизайн так что все это вообщем не нужно, однако мне не пришло в голову ваше решение, вот что такое замыленый глаз
Спасибо за помощь !
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / mysql и transactions
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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