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

Заранее извиняюсь, и знаю что превратите мой вопрос в пух и прах,
не пинайте сильно!

имею таблицы:
1, поставщики (нам нужен field поставщики_ид)
2, организации (нам нужен field организация_ид)
3, документы (документ_ид, тип_операции, поставщики_ид, организация_ид, .... )
4, продукция (продукция _ид, документ_ид, количество, цена, и прочее)

Мне надо запретить остальным потокам доступ к этим таблицам и выполнить все операции в одной транзакции:
1, проверка на exists поставщики_ид в таблице поставщики
2, update в этой таблице информацию этого поставщика, если Post содержит соответствующие данные,
3, проверка на exists организация_ид в таблице организации
4, update в этой таблице информацию этой организации, если Post содержит соответствующие данные,
5, Insert в табл, документы - тип_операции, поставщики_ид, организация_ид, ....
6, получить только что добавленный документ_ид
7, В цикле Insert в табл, продукция - документ_ид, количество, цена, ,,,
столько раз сколько содержит Post эти продукты


После долгого чтения документации mysql пришел к выводу что это нужно сделать в следующем порядке и запросами:
// как я понял из документации, если хочу использовать LOCK TABLES мне надо SET AUTOCOMMIT чтобы LOCK TABLES не сбросил транзакцию
SET AUTOCOMMIT=0

// закрываю таблицы для других пользователей, ( их мало, пуст ждут
LOCK TABLES таблицы перечисленные выше.

1. select from поставщики WHERE поставщики_ид = ??
2. если присутствует этот ид update поставщики .... WHERE поставщики_ид = ??
3 select from организации WHERE организация _ид = ??
4, если присутствует этот ид update организации... WHERE поставщики_ид = ??
5, Insert в табл документы
6, получить только что добавленный документ_ид
7, В цикле Insert в табл, продукция - документ_ид, количество, цена, ,,,
столько раз сколько содержит Post эти продукты


if(error == '') {
COMMIT
}else {
ROLLBACK
}

UNLOCK TABLES

Таким образом я хочу чтобы с этими таблицами мог работать один поток без возможности впихнутся в процесс другим потокам, пока не закончится транзакция.
Пользователей мало, таблицы маленькие, так что долго ждать другим не придется.

Пожалуйста, посоветуйте, правильно или нет организовал я решение своей задачи
...
Рейтинг: 0 / 0
Транзакция и LOCK TABLES
    #38532377
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Avtopic,

какого типа таблицы, какой движок используется?
...
Рейтинг: 0 / 0
Транзакция и LOCK TABLES
    #38532615
Avtopic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблицы InnoDB
...
Рейтинг: 0 / 0
Транзакция и LOCK TABLES
    #38533979
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я конечно задачи толком не знаю, но возможно получится все сделать в одном запросе...
...
Рейтинг: 0 / 0
Транзакция и LOCK TABLES
    #38534034
Avtopic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ,
Наверно возможно, но между запросами еще проверяется и остатки, и права юзера на проведение операции и отдельно еще права юзера на изменении информации конкретного поставщика и конкретной организации, и наверно не стоит морочится.
...
Рейтинг: 0 / 0
Транзакция и LOCK TABLES
    #38534385
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я навылет НЕ ПОНИМАЮ всего происходящего...

Уточните задачу.

1) Дайте DDL всех используемых таблиц. Само собой лишние поля удалите, оставьте те, что используются для связи, идентификации записи либо изменяются при обработке.
2) Чётко укажите, какие исходные данные поступают в обработку.
3) Полно и однозначно опишите алгоритм обработки.

Пока по тем обрывкам задачи. которые уже описаны, я не вижу не то что необходимости что-то лочить и запрещать доступ - вообще не вижу надобности хоть что-то предпринимать для такого разграничения.
...
Рейтинг: 0 / 0
Транзакция и LOCK TABLES
    #38534687
Avtopic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaЯ навылет НЕ ПОНИМАЮ всего происходящего...

Уточните задачу.

1) Дайте DDL всех используемых таблиц. Само собой лишние поля удалите, оставьте те, что используются для связи, идентификации записи либо изменяются при обработке.
2) Чётко укажите, какие исходные данные поступают в обработку.
3) Полно и однозначно опишите алгоритм обработки.

Пока по тем обрывкам задачи. которые уже описаны, я не вижу не то что необходимости что-то лочить и запрещать доступ - вообще не вижу надобности хоть что-то предпринимать для такого разграничения.
Упрощенно все можно описать так:

Юзер посылает Post в котором указывает тип операции, стороны операции, и перечень продукции в операции.
Этот же Post может содержать нового поставщика или организацию которая вставляется в соответствующие таблицы.
или, этот же Post может содержать изменения в информации поставщика или организации которая должна обновится.
Все в одном реквесте.

все это должно сохранится с учетом того, что другой юзер не удалил используемого поставщика или организацию, админ не запретил в это же время используемый тип операции, другой юзер не удалил продукцию которая участвует в операции и т. д.
...
Рейтинг: 0 / 0
Транзакция и LOCK TABLES
    #38534766
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторPost может содержать нового поставщика или организацию которая вставляется в соответствующие таблицы.
авторс учетом того, что другой юзер не удалил используемого поставщика или организацию ... другой юзер не удалил продукцию которая участвует в операции
В таком случае продукция, поставщик или организация для данного момента времени - новые, и должны быть вставлены. Т.е. на этот момент можно смело забить.
авторс учетом того, что ... админ не запретил в это же время используемый тип операции,
Это проверяется самым первым, ещё до изменения состояния таблиц. Или отказ, или разрешение.

Вывод - надо всего лишь запретить другим пользователям изменение (в т.ч. удаление) добавляемых/модифицируемых данных (записей) во время проведения операции. Блокировать все таблицы нет никакой необходимости. Вполне достаточно обернуть все активные действия в транзакцию с соотв. уровнем изоляции, и предварительно опознать и заблокировать изменяемые записи (см. SELECT ... FOR UPDATE и SELECT ... LOCK IN SHARE MODE ).
...
Рейтинг: 0 / 0
Транзакция и LOCK TABLES
    #38534861
Avtopic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaавторPost может содержать нового поставщика или организацию которая вставляется в соответствующие таблицы.авторс учетом того, что другой юзер не удалил используемого поставщика или организацию ... другой юзер не удалил продукцию которая участвует в операции
В таком случае продукция, поставщик или организация для данного момента времени - новые, и должны быть вставлены. Т.е. на этот момент можно смело забить.

тогда, LAST_INSERT_ID точно даст этим потоком вставленный ID ?
Akinaавторс учетом того, что ... админ не запретил в это же время используемый тип операции,
Это проверяется самым первым, ещё до изменения состояния таблиц. Или отказ, или разрешение.

В принципе, это так и делаю, просто, у страха большие глаза :)

AkinaВывод - надо всего лишь запретить другим пользователям изменение (в т.ч. удаление) добавляемых/модифицируемых данных (записей) во время проведения операции. Блокировать все таблицы нет никакой необходимости. Вполне достаточно обернуть все активные действия в транзакцию с соотв. уровнем изоляции, и предварительно опознать и заблокировать изменяемые записи (см. SELECT ... FOR UPDATE и SELECT ... LOCK IN SHARE MODE ).
сто раз прочитал эти SELECT ... FOR UPDATE и SELECT ... LOCK IN SHARE MODE
но до конца все ровно не понял,
если я сделаю SELECT ... FOR UPDAT в определенной таблице, без условии WHERE будут или нет блокироваться все строки в таблице. и если да, то не склонно ли это к дедлокам.

а Это мне нужно для следующего, о чем не упомянул в предыдущем посте:

в этой же операции проверяю остатки продукции в организации если продукция движется от него к поставщику (при коррекции), а также вычисляется средневзвешенная цена в определенный момент времени если происходит внутреннее перемещение или возврат. (стыдно, но должен признать что чертеж выше не совсем полный и у меня существует еще передвижения продукции между организация-организация, и в таблице документы в поле поставщики_ид может сидеть организация_ид и за целостность, в этом случае отвечает тип операции)
...
Рейтинг: 0 / 0
Транзакция и LOCK TABLES
    #38534957
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простите, но не могу сказать ничего, кроме простой вещи. Не поняли - читайте ещё раз. Нельзя что-то делать, не понимая, что делаешь, как, зачем, и как оно будет работать.
...
Рейтинг: 0 / 0
Транзакция и LOCK TABLES
    #38535046
Avtopic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо, что это Вы мне посоветовали.
...
Рейтинг: 0 / 0
Транзакция и LOCK TABLES
    #38535153
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не надо обижаться. У Вас задача, которую надо решить - это верно. Но именно решить, а не собезьянничать без понимания. Чтобы в будущем не прилетела плюха, а Вы не понимали, откуда именно. Не понимаете, читая - ставьте эксперименты или ищите в Сети дополнительные разъяснения по вопросу. Они будут объёмными, потому вряд ли кто станет повторять их тут - пальцев жалко.
Ну или нанимайте специалиста, который сделает, и забивайте в договор пункт, что он всё сделанное разъяснит. Тоже вариант.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Транзакция и LOCK TABLES
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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