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

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

имею таблицы:
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
20.01.2014, 20:26:22
    #38532377
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакция и LOCK TABLES
Avtopic,

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

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

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

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

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

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

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

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

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

Вывод - надо всего лишь запретить другим пользователям изменение (в т.ч. удаление) добавляемых/модифицируемых данных (записей) во время проведения операции. Блокировать все таблицы нет никакой необходимости. Вполне достаточно обернуть все активные действия в транзакцию с соотв. уровнем изоляции, и предварительно опознать и заблокировать изменяемые записи (см. SELECT ... FOR UPDATE и SELECT ... LOCK IN SHARE MODE ).
...
Рейтинг: 0 / 0
22.01.2014, 19:54:13
    #38534861
Avtopic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакция и LOCK TABLES
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
22.01.2014, 22:08:08
    #38534957
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакция и LOCK TABLES
Простите, но не могу сказать ничего, кроме простой вещи. Не поняли - читайте ещё раз. Нельзя что-то делать, не понимая, что делаешь, как, зачем, и как оно будет работать.
...
Рейтинг: 0 / 0
23.01.2014, 00:19:33
    #38535046
Avtopic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакция и LOCK TABLES
Хорошо, что это Вы мне посоветовали.
...
Рейтинг: 0 / 0
23.01.2014, 08:37:46
    #38535153
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакция и LOCK TABLES
А не надо обижаться. У Вас задача, которую надо решить - это верно. Но именно решить, а не собезьянничать без понимания. Чтобы в будущем не прилетела плюха, а Вы не понимали, откуда именно. Не понимаете, читая - ставьте эксперименты или ищите в Сети дополнительные разъяснения по вопросу. Они будут объёмными, потому вряд ли кто станет повторять их тут - пальцев жалко.
Ну или нанимайте специалиста, который сделает, и забивайте в договор пункт, что он всё сделанное разъяснит. Тоже вариант.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Транзакция и LOCK TABLES / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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