powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Транзации
3 сообщений из 3, страница 1 из 1
Транзации
    #39159257
Pim.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго времени суток!

У меня есть таблица ids (InnoDB) в которой хранятся следующий id primary key для всех таблиц (вместо auto_increment).
Мне нужно в процедуре обратиться к этой таблице, записать некоторые id в переменные, и проитерировать все использованные id на 1. При этом мне нужно быть уверенным, что во время исполнения моего потока, ни один другой поток не обратиться к этой таблице и не обновит значения до меня.

Правильно ли я понимаю, что мне достаточно все манипуляции сделать в одной транзакции и пока транзакция не закомитится, никто не сможет обратиться к тем полям, к которым я обратился? Или же нужно использовать lock table или изоляцию транзакций (я пока в этом мало понимаю)?

Таблица:
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE `ids` (
  `table_name` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '',
  `field_name` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '',
  `nextid` bigint(20) unsigned NOT NULL,
  PRIMARY KEY (`table_name`,`field_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;




Моя транзакция:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
START TRANSACTION;
	SET @hostid = (SELECT nextid FROM ids WHERE table_name='hosts' AND field_name='hostid');
	UPDATE ids SET nextid = nextid+1 WHERE table_name='hosts' AND field_name='hostid';
	SET @hosttempateid = (SELECT nextid FROM ids WHERE table_name='hosts_templates' AND field_name='hosttemplateid');
	UPDATE ids SET nextid = nextid+1 WHERE table_name='hosts_templates' AND field_name='hosttemplateid';
	SET @hostgroupid = (SELECT nextid FROM ids WHERE table_name='hosts_groups' AND field_name='hostgroupid');
	UPDATE ids SET nextid = nextid+1 WHERE table_name='hosts_groups' AND field_name='hostgroupid';
	SET @interfaceid = (SELECT nextid FROM ids WHERE table_name='interface' AND field_name='interfaceid');
	UPDATE ids SET nextid = nextid+1 WHERE table_name='interface' AND field_name='interfaceid';
COMMIT;
...
Рейтинг: 0 / 0
Транзации
    #39159283
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну наверное
START ......
SELECT .... FROM ...... FOR UPDATE
....................
COMMIT
...
Рейтинг: 0 / 0
Транзации
    #39159316
Pim.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinov,

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


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