(PHP+mysql) организация транзакций. и не только.
11 Января 2025, 05:31:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: С 1-го августа 2013 объявляется бессрочный месячник по борьбе с матом
   Начало   Главная Поиск Правила Камасутра Блоги Чат (1) Галерея Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: (PHP+mysql) организация транзакций. и не только.  (Прочитано 898 раз)
0 Пользователей и 1 Гость смотрят эту тему.
shandai ТС
Ветеран форума
******

Карма +452/-1
Offline 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 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 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 Offline

Пол: Мужской
Сообщений: 1334

город Хабаровск

Пешеход

« Ответ #6 : 20 Декабря 2008, 23:51:28 »

Спасибо.
Записан

Пешеход /Был: ЗАЗ-Lanos 1.6L 109 л.с. / Был: Иж 2126 гранат 2003г, УМПО, кастрюля, КПП ОМСК, стартер от ГАЗ 53, БК-21, звуковой сигнал от ГАЗ 3110, карб (солекс) ДААЗ-21073, свечи всегда "Чемпион", NGK-плохие, укороченная ручка КПП, БСЗ, подогрев заднего стекла и правого седенья, чехлы, тонировка задка, сцепа и диск totti, выжимной Coram, резина cordiant на штамповке РР от волги (все равно не помогает), перемычка АКБ-Стартер (тоже не помогла).
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines

Яндекс.Метрика

Google последней посетил эту страницу 19 Ноября 2024, 13:06:49