Вы не зашли.
#1.
Nu3oN
Off
(11)
Moderator
2011.04.13 23:11
Объясните дураку на пальцах о транзакциях!
Желательно с примерами о подробными комментариями и примеры использования...
Поюзал в гугле, почитал, но нифига не понял!
З.ы а то отстал в последнее время от кодинга... нифига толком не делаю! и желания нет
Я буду лучше голоден, но между креслом и рулем и на дороге.
#2.
tipsun
Off
(19)
Moderator
2011.04.13 23:11
В теме
PDO есть про это...
Отредактировано tipsun (2011.04.14 00:12)
#3.
Nu3oN
Off
(11)
Moderator
2011.04.14 00:12
tipsun написал:В теме
PDO есть про это...
Это немного не то, что я хочу узнать...
Я буду лучше голоден, но между креслом и рулем и на дороге.
#4.
tipsun
Off
(19)
Moderator
2011.04.14 00:12
Ну так напиши чавой надо
Типа так, ниодин запрос в теле транзакции не выполнится, если хотя бы в 1 вернет ошибку
на хую вас вертів
#6.
Nu3oN
Off
(11)
Moderator
2011.04.14 10:10
Читаю одну книженцию, понравилось вырожопывание:
"Хорошим тоном является выполнять запросы внутри транзакции, то есть сказать серверу предварительно «Эй, я собираюсь выполнить один или несколько запросов», затем передать сами запросы, и в итоге сказать «Я закончил передавать запросы, теперь выполни их!»"
Я буду лучше голоден, но между креслом и рулем и на дороге.
#7.
tipsun
Off
(19)
Moderator
2011.04.14 11:11
Да исполнит волю твою MySQL. Да будет так.
Отредактировано tipsun (2011.04.14 11:11)
#8.
Nu3oN
Off
(11)
Moderator
2011.04.14 11:11
Судя потому что я узнал, то:
Код:
span style="color: #0000BB"><?php// Есть у меня такой костыль:$query = DB :: $dbh -> exec("INSERT INTO %table1% SET `value` = ?;", $value);if ($query !== false) { DB :: $dbh -> exec("UPDATE %table2% SET `value` = `value` + 1 WHERE `id` = ?;", $id); // И тут может быть еще несколько таких костылей}// То его можно упростить таким видом?:DB :: $dbh -> beginTransaction();DB :: $dbh -> exec("INSERT INTO %table1% SET `value` = ?;", $value);DB :: $dbh -> exec("UPDATE %table2% SET `value` = `value` + 1 WHERE `id` = ?;", $id);// Еще какие то запросы...DB :: $dbh -> commit(); ?> |
Я буду лучше голоден, но между креслом и рулем и на дороге.
ну основная польза - это целостность данных. например, сначала у нас идет 2 инсерта подряд, в теории может пройти 1 инсерт, а во втором произойти какая-то ошибка, в случае с транзакциями, мы сможем откатить и 1 инсерт. без транзакций мы бы получили мусор в БД.
так же, если, например, в цикле выполняется много апдейтов. помимо того, что мы так же сможем все их откатить в случае ошибки, мы получаем выигрыш в производительности, т.к. физически запись занных на диск присходит только при коммите. реально это на моей практике давало огромный выигрыш на Sqlite БД.
#10.
Nu3oN
Off
(11)
Moderator
2011.04.14 11:11
Понятно! а что с моим примером? ему стоит место быть?
Gemorroj написал:
ну основная польза - это целостность данных. например, сначала у нас идет 2 инсерта подряд, в теории может пройти 1 инсерт, а во втором произойти какая-то ошибка, в случае с транзакциями, мы сможем откатить и 1 инсерт. без транзакций мы бы получили мусор в БД...
И еще! вот хотим мы выполнить транзакцию, но что лучше делать? и в чем будет разница?
Код:
SET AUTOCOMMIT=0 |
-------- |
START TRANSACTION; |
INSERT INTO %table1% SET `value` = ?; |
UPDATE %table2% SET `value` = `value` + 1 WHERE `id` = ?; |
COMMIT; |
Код:
span style="color: #0000BB"><?phpDB :: $dbh -> beginTransaction();DB :: $dbh -> exec("INSERT INTO %table1% SET `value` = ?;", $value);DB :: $dbh -> exec("UPDATE %table2% SET `value` = `value` + 1 WHERE `id` = ?;", $id);DB :: $dbh -> commit(); ?> |
Я буду лучше голоден, но между креслом и рулем и на дороге.
Nu3oN написал:
и в чем будет разница?
разница между чем и чем?
вообще я бы делал так
Код:
span style="color: #0000BB"><?phptry { DB :: $dbh -> beginTransaction(); DB :: $dbh -> exec("INSERT INTO %table1% SET `value` = ?;", $value); DB :: $dbh -> exec("UPDATE %table2% SET `value` = `value` + 1 WHERE `id` = ?;", $id); DB :: $dbh -> commit();} catch (Exception $e) { DB :: $dbh -> rollback();} |
$dbh, соответственно, должен бросать эксепшн, если что-то пошло не так.