#1 2011.04.13 23:53

Nu3oN
Moderator
Откуда: БелгородЭ
Зарегистрирован: 2010.04.28
Сообщений: 857
Карма: 11
Профиль Веб-сайт

Транзакции в MySQL

Объясните дураку на пальцах о транзакциях!
Желательно с примерами о подробными комментариями и примеры использования...
Поюзал в гугле, почитал, но нифига не понял!

З.ы а то отстал в последнее время от кодинга... нифига толком не делаю! и желания нет  sad


Я буду лучше голоден, но между креслом и рулем и на дороге.

Неактивен

#2 2011.04.13 23:56

tipsun
Moderator
Зарегистрирован: 2009.10.14
Сообщений: 2278
Карма: 19
Профиль

Re: Транзакции в MySQL

В теме PDO есть про это...

Отредактировано tipsun (2011.04.14 00:05)

Неактивен

#3 2011.04.14 00:15

Nu3oN
Moderator
Откуда: БелгородЭ
Зарегистрирован: 2010.04.28
Сообщений: 857
Карма: 11
Профиль Веб-сайт

Re: Транзакции в MySQL

tipsun написал:

В теме PDO есть про это...

Это немного не то, что я хочу узнать...


Я буду лучше голоден, но между креслом и рулем и на дороге.

Неактивен

#4 2011.04.14 00:18

tipsun
Moderator
Зарегистрирован: 2009.10.14
Сообщений: 2278
Карма: 19
Профиль

Re: Транзакции в MySQL

Ну так напиши чавой надо smile

Неактивен

#5 2011.04.14 00:43

Fuelen
Участник
Откуда: Украина
Зарегистрирован: 2009.06.22
Сообщений: 229
Карма: 5
Профиль

Re: Транзакции в MySQL

Типа так, ниодин запрос в теле транзакции не выполнится, если хотя бы в 1 вернет ошибку

Неактивен

#6 2011.04.14 10:47

Nu3oN
Moderator
Откуда: БелгородЭ
Зарегистрирован: 2010.04.28
Сообщений: 857
Карма: 11
Профиль Веб-сайт

Re: Транзакции в MySQL

Читаю одну книженцию, понравилось вырожопывание:

"Хорошим тоном является выполнять запросы внутри транзакции, то есть сказать серверу предварительно «Эй, я собираюсь выполнить один или несколько запросов», затем передать сами запросы, и в итоге сказать «Я закончил передавать запросы, теперь выполни их!»"

big_smile


Я буду лучше голоден, но между креслом и рулем и на дороге.

Неактивен

#7 2011.04.14 11:18

tipsun
Moderator
Зарегистрирован: 2009.10.14
Сообщений: 2278
Карма: 19
Профиль

Re: Транзакции в MySQL

big_smile Да исполнит волю твою MySQL. Да будет так.

Отредактировано tipsun (2011.04.14 11:25)

Неактивен

#8 2011.04.14 11:25

Nu3oN
Moderator
Откуда: БелгородЭ
Зарегистрирован: 2010.04.28
Сообщений: 857
Карма: 11
Профиль Веб-сайт

Re: Транзакции в MySQL

Судя потому что я узнал, то:

Код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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(); 
?>

Я буду лучше голоден, но между креслом и рулем и на дороге.

Неактивен

#9 2011.04.14 11:35

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6538
Карма: 108
Профиль Веб-сайт

Re: Транзакции в MySQL

ну основная польза - это целостность данных. например, сначала у нас идет 2 инсерта подряд, в теории может пройти 1 инсерт, а во втором произойти какая-то ошибка, в случае с транзакциями, мы сможем откатить и 1 инсерт. без транзакций мы бы получили мусор в БД.
так же, если, например, в цикле выполняется много апдейтов. помимо того, что мы так же сможем все их откатить в случае ошибки, мы получаем выигрыш в производительности, т.к. физически запись занных на диск присходит только при коммите. реально это на моей практике давало огромный выигрыш на Sqlite БД.

Неактивен

#10 2011.04.14 11:43

Nu3oN
Moderator
Откуда: БелгородЭ
Зарегистрирован: 2010.04.28
Сообщений: 857
Карма: 11
Профиль Веб-сайт

Re: Транзакции в MySQL

Понятно! а что с моим примером? ему стоит место быть?

Gemorroj написал:

ну основная польза - это целостность данных. например, сначала у нас идет 2 инсерта подряд, в теории может пройти 1 инсерт, а во втором произойти какая-то ошибка, в случае с транзакциями, мы сможем откатить и 1 инсерт. без транзакций мы бы получили мусор в БД...

И еще! вот хотим мы выполнить транзакцию, но что лучше делать? и в чем будет разница?

Код:

1
2
3
4
5
6
SET AUTOCOMMIT=0
--------
START TRANSACTION;
INSERT INTO %table1% SET `value` = ?;
UPDATE %table2% SET `value` = `value` + 1 WHERE `id` = ?;
COMMIT;

Код:

1
2
3
4
5
6
<?php
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(); 
?>

Я буду лучше голоден, но между креслом и рулем и на дороге.

Неактивен

#11 2011.04.14 14:23

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6538
Карма: 108
Профиль Веб-сайт

Re: Транзакции в MySQL

Nu3oN написал:

и в чем будет разница?

разница между чем и чем?
вообще я бы делал так

Код:

1
2
3
4
5
6
7
8
9
<?php
try {
    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, соответственно, должен бросать эксепшн, если что-то пошло не так.

Неактивен

Дополнительно

forum.wapinet.ru

PunBB Mod v0.6.1
0.012 s