shandai ТС
Ветеран форума
Карма +452/-1
Offline
Пол:
Сообщений: 1334
город Хабаровск
Пешеход
|
|
« : 17 Декабря 2008, 18:18:07 » |
|
Доброго времени суток. Мне нужно организавать простейшую транзакцию на пхп и мускл. 1. В моей книге не описан этот омомент, есть только на пхп3 образец, но он не очень понятен так как там только кусок кода. а я юзаю пхп5. вот мой код: ======================================================== $db = new mysqli ('localhost','','','satit'); if (mysqli_connect_errno()) {echo 'Nevozmogno podkluchitsa k baze'; exit;} $query = "insert into arhiv select * from podkl where id='1919' "; $result = $db->query($query); $num_results = $result->num_rows; $query = "delete from podkl where id='1919' "; $result = $db->query($query); $num_results = $result->num_rows; ======================================================== как мне запихнуть это в транзакцию и понять что если она выолнена то сделать COMMIT в противном случае ROLLBACK. 2. При использовнии кода: insert into arhiv (a,b,c,d) select a,b, from podkl where id='1919'. Мне надо добавить в этом же запросе 'с' и 'd' но взятые из сесии (динамические), как это можно сделать? Спасибо.
|
|
|
Записан
|
Пешеход /Был: ЗАЗ-Lanos 1.6L 109 л.с. / Был: Иж 2126 гранат 2003г, УМПО, кастрюля, КПП ОМСК, стартер от ГАЗ 53, БК-21, звуковой сигнал от ГАЗ 3110, карб (солекс) ДААЗ-21073, свечи всегда "Чемпион", NGK-плохие, укороченная ручка КПП, БСЗ, подогрев заднего стекла и правого седенья, чехлы, тонировка задка, сцепа и диск totti, выжимной Coram, резина cordiant на штамповке РР от волги (все равно не помогает), перемычка АКБ-Стартер (тоже не помогла).
|
|
|
glory
Гость
|
|
« Ответ #1 : 17 Декабря 2008, 21:25:57 » |
|
1. Транзакции работают только в транзакционных таблицах вроде InnoDB, а MyISAM и ISAM к таким не относятся. или $db->query("start transaction"); <do anything>; $db->commit/rollback(); или $db->autocommit(FALSE); // после этого любой набор операций надо явно коммитить <do anything once> $db->commit(); // transaction 1 <do anything else> $db->commit(); // transaction 2 commit возвращает false - ошибка, иначе - успех. 2. самое простое: $c = 'xxx'; $d = 'yyy'; $query = " insert into arhiv (a,b,c,d) select a,b,'$c','$d' from podkl where id='1919' " или речь о чем-то другом??
|
|
« Последнее редактирование: 17 Декабря 2008, 21:31:38 от glory »
|
Записан
|
|
|
|
shandai ТС
Ветеран форума
Карма +452/-1
Offline
Пол:
Сообщений: 1334
город Хабаровск
Пешеход
|
|
« Ответ #2 : 18 Декабря 2008, 00:29:20 » |
|
glory спасибо огромное за отклик 1. про тип innodb я в курсе. таблица в этом типе. но твой код мне не понятен, если можно ссылку на оргигнал или поясни: $db->query("start transaction"); <do anything>; $db->commit/rollback(); т.е. мой код будет: $db->query("start transaction"); $query = "insert into arhiv select * from podkl where id='1919' "; $result = $db->query($query); $query = "delete from podkl where id='1919' "; $result = $db->query($query); $db->commit/rollback(); Только как понять что применять commit или roolback? 2. Вообще в точку, блин сам бы точно не догадался, в примерах не нашел. Спасибо.
|
|
|
Записан
|
Пешеход /Был: ЗАЗ-Lanos 1.6L 109 л.с. / Был: Иж 2126 гранат 2003г, УМПО, кастрюля, КПП ОМСК, стартер от ГАЗ 53, БК-21, звуковой сигнал от ГАЗ 3110, карб (солекс) ДААЗ-21073, свечи всегда "Чемпион", NGK-плохие, укороченная ручка КПП, БСЗ, подогрев заднего стекла и правого седенья, чехлы, тонировка задка, сцепа и диск totti, выжимной Coram, резина cordiant на штамповке РР от волги (все равно не помогает), перемычка АКБ-Стартер (тоже не помогла).
|
|
|
glory
Гость
|
|
« Ответ #3 : 19 Декабря 2008, 22:12:34 » |
|
т.е. мой код будет: да, примерно так - если что-то не понравилось в середине транзакции, например, не сошлись какие-то условия, то rollback - если if ($db->commit() === false) $db->rollback(); И еще, все таки не мешало бы проверять успешность выполнения инструкции $db->query, т.к. глюкнуть может на клиентской стороне и запрос до сервера не дойдет вообще, соответственно он понятия не будет иметь о сбойном запросе и коммит может завершиться вполне корректно.
|
|
« Последнее редактирование: 19 Декабря 2008, 22:14:19 от glory »
|
Записан
|
|
|
|
shandai ТС
Ветеран форума
Карма +452/-1
Offline
Пол:
Сообщений: 1334
город Хабаровск
Пешеход
|
|
« Ответ #4 : 19 Декабря 2008, 22:30:25 » |
|
- если if ($db->commit() === false) $db->rollback();
Вот эту строчку я и хотел увидеть, не мог понять как все это происходит через PHP, а нет у тебя ссылок на ресурсы? что б почитать про транзакции по больше, и что б с примерами, если есть книги у тебя скажи издателсьво как назваются и автора, желательно о PHP и транзакциях с блокировкаи на запись, чтение. мне еще предстоит сделать блокировку на запись, (что б другие в этот момент не записывали). К примеру как заблокировать запись котрую я выбираю что б ее уже ни кто ни читал ни записывал? Подзабыл я, если можешь ссылку. Понятно что объснять долго, или книгу подскажи. Спасибо.
|
|
|
Записан
|
Пешеход /Был: ЗАЗ-Lanos 1.6L 109 л.с. / Был: Иж 2126 гранат 2003г, УМПО, кастрюля, КПП ОМСК, стартер от ГАЗ 53, БК-21, звуковой сигнал от ГАЗ 3110, карб (солекс) ДААЗ-21073, свечи всегда "Чемпион", NGK-плохие, укороченная ручка КПП, БСЗ, подогрев заднего стекла и правого седенья, чехлы, тонировка задка, сцепа и диск totti, выжимной Coram, резина cordiant на штамповке РР от волги (все равно не помогает), перемычка АКБ-Стартер (тоже не помогла).
|
|
|
glory
Гость
|
|
« Ответ #5 : 20 Декабря 2008, 12:32:21 » |
|
Вот эту строчку я и хотел увидеть, не мог понять как все это происходит через PHP, а нет у тебя ссылок на ресурсы? Основные ресурсы http://dev.mysql.com/doc/ и http://php.net что б почитать про транзакции по больше, и что б с примерами, если есть книги у тебя скажи издателсьво как назваются и автора, желательно о PHP и транзакциях с блокировкаи на запись, чтение. мне еще предстоит сделать блокировку на запись, (что б другие в этот момент не записывали). Литературу порекомендовать не могу, все то, что попадалось описывало механизм транзакций и их использование весьма посредственно. К примеру как заблокировать запись котрую я выбираю что б ее уже ни кто ни читал ни записывал? SELECT <fieldlist> FROM <tablename> WHERE <conditions> FOR UPDATE Блокировка снимается коммитом или роллбеком.
|
|
|
Записан
|
|
|
|
shandai ТС
Ветеран форума
Карма +452/-1
Offline
Пол:
Сообщений: 1334
город Хабаровск
Пешеход
|
|
« Ответ #6 : 20 Декабря 2008, 23:51:28 » |
|
Спасибо.
|
|
|
Записан
|
Пешеход /Был: ЗАЗ-Lanos 1.6L 109 л.с. / Был: Иж 2126 гранат 2003г, УМПО, кастрюля, КПП ОМСК, стартер от ГАЗ 53, БК-21, звуковой сигнал от ГАЗ 3110, карб (солекс) ДААЗ-21073, свечи всегда "Чемпион", NGK-плохие, укороченная ручка КПП, БСЗ, подогрев заднего стекла и правого седенья, чехлы, тонировка задка, сцепа и диск totti, выжимной Coram, резина cordiant на штамповке РР от волги (все равно не помогает), перемычка АКБ-Стартер (тоже не помогла).
|
|
|
|