powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / INSERT с последующей блокировкой строки. InnoDB
7 сообщений из 7, страница 1 из 1
INSERT с последующей блокировкой строки. InnoDB
    #39021047
nycka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день

Есть простая таблица:

Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE IF NOT EXISTS `items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `item_id` int(11) NOT NULL,
  `any_data` varchar(32) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;




1)В таблицу нужно добавить (item_id,'any_data') и на добавленную запись сразу же установить блокировку изменения данных(как вариант FOR UPDATE).
2)Одновременно несколько клиентов пытаются добавить те же самые данные.

Пробовала так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
BEGIN;
LOCK TABLES items WRITE;

#Удостоверимся что данный client_id точно не был добавлен
#Если запись - пркращаем работу
#Если записи такой нету то продолжаем
SELECT * FROM items WHERE item_id=n LOCK IN SHARE MODE;

INSERT INTO items(item_id , any_data) VALUES(n , 'any_data_str');

#Блокируем запись
SELECT * FROM items WHERE client_id=n FOR UPDATE

#Дальше следует разблокировать таблицу, но тогда автоматически будет COMMIT
COMMIT;#???????
UNLOCK TABLES;#???????



Как после вставки строки заблокировать добавленную строку строку на запись разблокировав всю таблицу для остальных клиентов?

Спасибо
...
Рейтинг: 0 / 0
INSERT с последующей блокировкой строки. InnoDB
    #39021054
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не проще уникальный ключ создать на те поля, в которые нельзя вставлять одинаковые данные?
...
Рейтинг: 0 / 0
INSERT с последующей блокировкой строки. InnoDB
    #39021081
nycka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftА не проще уникальный ключ создать на те поля, в которые нельзя вставлять одинаковые данные?
Согласен, это делает проверку существования бессмысленной, но после разблокировки таблицы транзакция закомитится и перестанет действовать блокировка
Код: sql
1.
SELECT * FROM items WHERE client_id=n FOR UPDATE
...
Рейтинг: 0 / 0
INSERT с последующей блокировкой строки. InnoDB
    #39021166
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так не коммить транзакцию автоматически.
...
Рейтинг: 0 / 0
INSERT с последующей блокировкой строки. InnoDB
    #39021202
nycka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Так если разблокировать таблицу с пом

Код: sql
1.
UNLOCK TABLES;



то текущая транзакция закомитится автоматически
...
Рейтинг: 0 / 0
INSERT с последующей блокировкой строки. InnoDB
    #39021385
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как после вставки строки заблокировать добавленную строку строку на запись разблокировав всю таблицу для остальных клиентов?

все проще.

После вставки в таблицу Innodb новые записи видны только вставившей транзакции, поэтому нужно просто начать транзакцию, вставить записи, получить их идентификаторы, заблокировать их если надо Select ... for update,
обработать данные и завершить транзакцию.

"одинаковые" данные нужно отсекать с помощью уникального ключа.
...
Рейтинг: 0 / 0
INSERT с последующей блокировкой строки. InnoDB
    #39022707
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivКак после вставки строки заблокировать добавленную строку строку на запись разблокировав всю таблицу для остальных клиентов?

все проще.

После вставки в таблицу Innodb новые записи видны только вставившей транзакции, поэтому нужно просто начать транзакцию, вставить записи, получить их идентификаторы, заблокировать их если надо Select ... for update,
обработать данные и завершить транзакцию.

"одинаковые" данные нужно отсекать с помощью уникального ключа.

или insert for duplication key update если логика такая.... ну скажем идёт вставка данных сразу с нескольких источников(у меня было) и величина должна сумироваться, но не известно есть уже для заданого первичного ключа запись или есчё нету.

все делают инсерт + апдейт при дубле ключа.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / INSERT с последующей блокировкой строки. InnoDB
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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