|
|
|
одновременное обновление записи в бд
|
|||
|---|---|---|---|
|
#18+
Добрый день! попросили сделать форму на работе для записи некоторого действия(заказ подарков). Пишу в csv. При этом одновременно с записью в файл мне надо уменьшать количество подарков на один. Я не программер поэтому сделал вот что. <?php $csvFile = 'new.csv'; $csvData = "{$_POST['Name']};{$_POST['Firm']};{$_POST['Contact_face']};{$_POST['Position']};{$_POST['Phone']};{$_POST['select1']};{$_POST['select2']};{$_POST['mail']}\n"; file_put_contents( $csvFile, $csvData, FILE_APPEND ); $my_select = "{$_POST['select2']}"; $sql = mysql_query("SELECT contentid, value, pagetitle, modx_site_content.id FROM modx_site_tmplvar_contentvalues, modx_site_content WHERE modx_site_content.id=modx_site_tmplvar_contentvalues.contentid AND pagetitle = '$my_select'"); while ($row = mysql_fetch_object($sql)) { $value = $row -> value; $contentid = $row -> contentid; $pagetitle = $row -> pagetitle; echo "Заявка на ", $pagetitle, " оформлена", "<br>"; $new_value = $value - 1; //echo "Осталось ", $new_value; $update = ("UPDATE modx_site_tmplvar_contentvalues, modx_site_content SET value = '$new_value' WHERE modx_site_content.id=modx_site_tmplvar_contentvalues.contentid AND pagetitle = '$my_select'"); $dummy = mysql_query($update); } ?> соответсна дергаю значение параметра , вывожу нужные данные и обновляю значение уменьшая его на единицу. Если форму отправляет несколько человек одновременно, то записи в csv пишутся все но количество уменьшается только на единицу. Не знаю куда копать..учитался уже . Есть подозрение что мускул видит все одной транзакцией, но не понятно как это лечить. и так ли это вообще. В любом случае благодарен любой помощи и подсказке..я уже иссяк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2014, 10:25:55 |
|
||
|
одновременное обновление записи в бд
|
|||
|---|---|---|---|
|
#18+
kenterberiiskiiSET value = '$new_value'Смотрите как получается: 1) Допустим было value=100 2) Первая сессия читает число 100 3) Вторая сессия читает число 100 4) Первая сессия вычитает 1, получает 99 5) Вторая сессия вычитает 1, получает 99 6) Первая сессия пишет 99 7) Вторая сессия пишет 99 Используйте SELECT ... FOR UPDATE, чтобы в пункте 3 вторая сессия ждала снятия блокировки. Не забудьте выключить в MySQL автокоммит либо явно начать транзакцию. Блокировка записи снимается при коммите или откате транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2014, 10:48:05 |
|
||
|
одновременное обновление записи в бд
|
|||
|---|---|---|---|
|
#18+
miksoftkenterberiiskiiSET value = '$new_value'Смотрите как получается: 1) Допустим было value=100 2) Первая сессия читает число 100 3) Вторая сессия читает число 100 4) Первая сессия вычитает 1, получает 99 5) Вторая сессия вычитает 1, получает 99 6) Первая сессия пишет 99 7) Вторая сессия пишет 99 Используйте SELECT ... FOR UPDATE, чтобы в пункте 3 вторая сессия ждала снятия блокировки. Не забудьте выключить в MySQL автокоммит либо явно начать транзакцию. Блокировка записи снимается при коммите или откате транзакции. не надо слушать миксофта :) извини братан :) update table set count=count-1 where count > 1 и смотреть на результат работы affected_rows ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2014, 10:57:39 |
|
||
|
одновременное обновление записи в бд
|
|||
|---|---|---|---|
|
#18+
alex564657498765453update table set count=count-1Можно и так, но до селекта. И последняя строка моего предыдущего поста все равно остается в силе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2014, 11:01:43 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38801642&tid=1833956]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
87ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 367ms |

| 0 / 0 |
