powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как обезопаситься при конкурентной транзакционной вставке ?
9 сообщений из 9, страница 1 из 1
Как обезопаситься при конкурентной транзакционной вставке ?
    #39770885
korumbo1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
такая задача. Я генерю sql dumb динамически для последующей вставки данных в бд. Каждый раз это касается 3 таблиц. Главная и 2 с foreign key от неё. Что я делаю. Создаю переменную в самом начале и присваиваю ей результат от запроса last insert id. Затем после каждой вставки в эти 3 таблицы делаю @var =@var+1 для последующей подстановки для других запросов для 3 таблиц. Как разрулить правильнее с транзакциями и уровнями изолирования что бы не было такого что 2 транзакции будут писать одинаковый primary key в первую таблицу?
PS. Откат на транзакцию делается в php при ошибке какой нибудь
...
Рейтинг: 0 / 0
Как обезопаситься при конкурентной транзакционной вставке ?
    #39770899
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем?

Код: sql
1.
2.
3.
4.
5.
6.
7.
INSERT INTO table1 (список полей 1) 
    VALUES (список  значений 1)

INSERT INTO table2 (table1_id, список полей 2) 
    SELECT table1.id, (список значений 2) 
    FROM table1
    WHERE (список полей 1) = (список  значений 1)
...
Рейтинг: 0 / 0
Как обезопаситься при конкурентной транзакционной вставке ?
    #39771154
korumbo1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для второй таблицы свои значения. Мы туда только Id значение первой таблицы переносим которое было сгенерировано при вставке в первую таблицу.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
INSERT INTO product (shop_id, type_id, updated_at, created_at) VALUES(1, 1, 1549583871, 1549583871);

SELECT LAST_INSERT_ID() FROM product LIMIT 1 INTO @product_id;
INSERT INTO `shoes` (product_id, url, `name`, `sub_name`, `description`, `price`, `article`, `color`, `updated_at`, `created_at`) VALUES (@product_id, 'https://store.nike.com', 'NIKE AIR MAX 95 iD', 'NIKE AIR MAX 95 iD', '', '190', '',  '', 1549583871, 1549583871);

INSERT INTO `images` (product_id, patch) VALUES (@product_id,'f48z06mnzdff5uxrlnndd.jpg',1549583871,1549583871);

SET @product_id = @product_id +1;




Затем тоже самое только без запроса поиска последнего id
...
Рейтинг: 0 / 0
Как обезопаситься при конкурентной транзакционной вставке ?
    #39771156
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korumbo1Мы туда только Id значение первой таблицы переносим которое было сгенерировано при вставке в первую таблицу.Правильно. И этот ID мы получаем запросом в первую таблицу по тем значениям, которые мы в неё только что вставили. И это работает во всех случаях, кроме одного - когда таблица допускает полные (кроме поля автоинкремента) дубликаты записей.

Опять же - если всё происходит в рамках одного соединения (нет обрывов, и не используется пул), то никто не мешает делать

Код: sql
1.
2.
3.
4.
5.
INSERT INTO table1 (список полей 1) 
    VALUES (список  значений 1)

INSERT INTO table2 (table1_id, список полей 2) 
    LAST_INSERT_ID(), (список  значений 2)



korumbo1
Код: sql
1.
SELECT LAST_INSERT_ID() FROM product LIMIT 1 INTO @product_id;

LIMIT-то тут за каким хреном?
Кстати, при обрыве соединения посередь процесса получится фигня, и автовосстановление не поможет. Равно как и при использовании пула соединений.
...
Рейтинг: 0 / 0
Как обезопаситься при конкурентной транзакционной вставке ?
    #39771158
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korumbo1
Код: sql
1.
SET @product_id = @product_id +1;

А это так и вовсе сказка - переменная-то сессионная.
...
Рейтинг: 0 / 0
Как обезопаситься при конкурентной транзакционной вставке ?
    #39771322
korumbo1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

Даже все эти вставки в транзакцию закатать то все равно не поможет?
...
Рейтинг: 0 / 0
Как обезопаситься при конкурентной транзакционной вставке ?
    #39771337
korumbo1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinakorumbo1
Код: sql
1.
SET @product_id = @product_id +1;

А это так и вовсе сказка - переменная-то сессионная.

Работаю с framework и там соединение одно единственное на вся работу запроса
...
Рейтинг: 0 / 0
Как обезопаситься при конкурентной транзакционной вставке ?
    #39771394
korumbo1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinakorumbo1Мы туда только Id значение первой таблицы переносим которое было сгенерировано при вставке в первую таблицу.Правильно. И этот ID мы получаем запросом в первую таблицу по тем значениям, которые мы в неё только что вставили. И это работает во всех случаях, кроме одного - когда таблица допускает полные (кроме поля автоинкремента) дубликаты записей.

Опять же - если всё происходит в рамках одного соединения (нет обрывов, и не используется пул), то никто не мешает делать

Код: sql
1.
2.
3.
4.
5.
INSERT INTO table1 (список полей 1) 
    VALUES (список  значений 1)

INSERT INTO table2 (table1_id, список полей 2) 
    LAST_INSERT_ID(), (список  значений 2)



korumbo1
Код: sql
1.
SELECT LAST_INSERT_ID() FROM product LIMIT 1 INTO @product_id;

LIMIT-то тут за каким хреном?
Кстати, при обрыве соединения посередь процесса получится фигня, и автовосстановление не поможет. Равно как и при использовании пула соединений.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
mysql> SELECT LAST_INSERT_ID() FROM product;
+------------------+
| LAST_INSERT_ID() |
+------------------+
|               97 |
|               97 |
|               97 |
|               97 |
|               97 |
|               97 |
|               97 |
|               97 |
|               97 |
|               97 |
|               97 |
|               97 |
|               97 |
+------------------+
13 rows in set (0.00 sec)
...
Рейтинг: 0 / 0
Как обезопаситься при конкурентной транзакционной вставке ?
    #39771397
korumbo1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
START TRANSACTION;

INSERT INTO product (shop_id) VALUES (1);
INSERT INTO shoes(product_id, brand) VALUES (LAST_INSERT_ID(), "brand new1");


INSERT INTO product (shop_id) VALUES (1);
INSERT INTO shoes(product_id, brand) VALUES (LAST_INSERT_ID(), "brand new2");

INSERT INTO product (shop_id) VALUES (1);
INSERT INTO shoes(product_id, brand) VALUES (LAST_INSERT_ID(), "brand new3");

COMMIT;




Код: sql
1.
2.
3.
4.
<e>Query: INSERT INTO shoes(product_id, brand) VALUES (LAST_INSERT_ID(), "brand new2")

Error Code: 1452
Cannot add or update a child row: a foreign key constraint fails (`learning`.`shoes`, CONSTRAINT `porduct_id_fk` FOREIGN KEY (`product_id`) REFERENCES `product` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как обезопаситься при конкурентной транзакционной вставке ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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