|
|
|
Транзакция и LOCK TABLES
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Заранее извиняюсь, и знаю что превратите мой вопрос в пух и прах, не пинайте сильно! имею таблицы: 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 Таким образом я хочу чтобы с этими таблицами мог работать один поток без возможности впихнутся в процесс другим потокам, пока не закончится транзакция. Пользователей мало, таблицы маленькие, так что долго ждать другим не придется. Пожалуйста, посоветуйте, правильно или нет организовал я решение своей задачи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 15:13:26 |
|
||
|
Транзакция и LOCK TABLES
|
|||
|---|---|---|---|
|
#18+
Avtopic, какого типа таблицы, какой движок используется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2014, 20:26:22 |
|
||
|
Транзакция и LOCK TABLES
|
|||
|---|---|---|---|
|
#18+
Таблицы InnoDB ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2014, 02:21:52 |
|
||
|
Транзакция и LOCK TABLES
|
|||
|---|---|---|---|
|
#18+
Я конечно задачи толком не знаю, но возможно получится все сделать в одном запросе... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2014, 10:28:16 |
|
||
|
Транзакция и LOCK TABLES
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответ, Наверно возможно, но между запросами еще проверяется и остатки, и права юзера на проведение операции и отдельно еще права юзера на изменении информации конкретного поставщика и конкретной организации, и наверно не стоит морочится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2014, 11:09:05 |
|
||
|
Транзакция и LOCK TABLES
|
|||
|---|---|---|---|
|
#18+
Я навылет НЕ ПОНИМАЮ всего происходящего... Уточните задачу. 1) Дайте DDL всех используемых таблиц. Само собой лишние поля удалите, оставьте те, что используются для связи, идентификации записи либо изменяются при обработке. 2) Чётко укажите, какие исходные данные поступают в обработку. 3) Полно и однозначно опишите алгоритм обработки. Пока по тем обрывкам задачи. которые уже описаны, я не вижу не то что необходимости что-то лочить и запрещать доступ - вообще не вижу надобности хоть что-то предпринимать для такого разграничения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2014, 14:48:37 |
|
||
|
Транзакция и LOCK TABLES
|
|||
|---|---|---|---|
|
#18+
AkinaЯ навылет НЕ ПОНИМАЮ всего происходящего... Уточните задачу. 1) Дайте DDL всех используемых таблиц. Само собой лишние поля удалите, оставьте те, что используются для связи, идентификации записи либо изменяются при обработке. 2) Чётко укажите, какие исходные данные поступают в обработку. 3) Полно и однозначно опишите алгоритм обработки. Пока по тем обрывкам задачи. которые уже описаны, я не вижу не то что необходимости что-то лочить и запрещать доступ - вообще не вижу надобности хоть что-то предпринимать для такого разграничения. Упрощенно все можно описать так: Юзер посылает Post в котором указывает тип операции, стороны операции, и перечень продукции в операции. Этот же Post может содержать нового поставщика или организацию которая вставляется в соответствующие таблицы. или, этот же Post может содержать изменения в информации поставщика или организации которая должна обновится. Все в одном реквесте. все это должно сохранится с учетом того, что другой юзер не удалил используемого поставщика или организацию, админ не запретил в это же время используемый тип операции, другой юзер не удалил продукцию которая участвует в операции и т. д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2014, 17:30:11 |
|
||
|
Транзакция и LOCK TABLES
|
|||
|---|---|---|---|
|
#18+
авторPost может содержать нового поставщика или организацию которая вставляется в соответствующие таблицы. авторс учетом того, что другой юзер не удалил используемого поставщика или организацию ... другой юзер не удалил продукцию которая участвует в операции В таком случае продукция, поставщик или организация для данного момента времени - новые, и должны быть вставлены. Т.е. на этот момент можно смело забить. авторс учетом того, что ... админ не запретил в это же время используемый тип операции, Это проверяется самым первым, ещё до изменения состояния таблиц. Или отказ, или разрешение. Вывод - надо всего лишь запретить другим пользователям изменение (в т.ч. удаление) добавляемых/модифицируемых данных (записей) во время проведения операции. Блокировать все таблицы нет никакой необходимости. Вполне достаточно обернуть все активные действия в транзакцию с соотв. уровнем изоляции, и предварительно опознать и заблокировать изменяемые записи (см. SELECT ... FOR UPDATE и SELECT ... LOCK IN SHARE MODE ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2014, 18:37:30 |
|
||
|
Транзакция и LOCK TABLES
|
|||
|---|---|---|---|
|
#18+
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 будут или нет блокироваться все строки в таблице. и если да, то не склонно ли это к дедлокам. а Это мне нужно для следующего, о чем не упомянул в предыдущем посте: в этой же операции проверяю остатки продукции в организации если продукция движется от него к поставщику (при коррекции), а также вычисляется средневзвешенная цена в определенный момент времени если происходит внутреннее перемещение или возврат. (стыдно, но должен признать что чертеж выше не совсем полный и у меня существует еще передвижения продукции между организация-организация, и в таблице документы в поле поставщики_ид может сидеть организация_ид и за целостность, в этом случае отвечает тип операции) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2014, 19:54:13 |
|
||
|
Транзакция и LOCK TABLES
|
|||
|---|---|---|---|
|
#18+
Простите, но не могу сказать ничего, кроме простой вещи. Не поняли - читайте ещё раз. Нельзя что-то делать, не понимая, что делаешь, как, зачем, и как оно будет работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2014, 22:08:08 |
|
||
|
Транзакция и LOCK TABLES
|
|||
|---|---|---|---|
|
#18+
Хорошо, что это Вы мне посоветовали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2014, 00:19:33 |
|
||
|
Транзакция и LOCK TABLES
|
|||
|---|---|---|---|
|
#18+
А не надо обижаться. У Вас задача, которую надо решить - это верно. Но именно решить, а не собезьянничать без понимания. Чтобы в будущем не прилетела плюха, а Вы не понимали, откуда именно. Не понимаете, читая - ставьте эксперименты или ищите в Сети дополнительные разъяснения по вопросу. Они будут объёмными, потому вряд ли кто станет повторять их тут - пальцев жалко. Ну или нанимайте специалиста, который сделает, и забивайте в договор пункт, что он всё сделанное разъяснит. Тоже вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2014, 08:37:46 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38534766&tid=1835357]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 347ms |

| 0 / 0 |
