Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Глупые вопросы по транзакциям в MySQL  (Прочитано 19840 раз)
0 Пользователей и 9 Гостей смотрят эту тему.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« : 10-03-2010 11:53 » 

Никогда раньше не работал серьезно с транзакциями, особенно в MySQL.. Поэтому хочу прояснить для себя несколько моментов...
Окружение:
* Windows 2003 Server
* MySQL 5.0.24a
* PHP 5.2.6
* MySQL ODBC Connector 3.51.24
* Таблицы InnoDB

С базой работаю либо напрямую через php (родные функции libmysql - mysql_query(), etc), либо через ODBC из .NET/JScript

Вопросы:
В рамках какой сессии живут транзакции?
Например, если я делаю так:
Код: (PHP)
mysql_query("start transaction");
mysql_query("delete from mytable1 where field1=24");
mysql_query("delete from mytable2 where field2=172");
mysql_query("delete from mytable3 where field3=18");
mysql_query("update table4 set field4=11 where field5=1");
mysql_query("commit");
Правильно ли это и что произойдет если, например, в запросе с update произойдет исключение (неважно какое - например, неправильный синтаксис)? Откатится ли транзакция если я не перехватываю исключения? Что если второй поток (это ж php) в это же время будет делать то же самое (или не то же самое) - под тем же юзером - не закоммитится ли моя транзакция раньше своего коммита - или commit выполняется только для транзакции открытой для текущей php сессии (mysql сессии)?

Тот же вопрос для операций через ODBC.. Есть ли тут разница?

Очень не хочется поменять работающую логику и потом отлавливать зависшие транзакции Жаль
Без них работает, но очень уж много может съехать если в цикле из 500 запросов последний выкинет все нафиг... Жаль
Спасибо..
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 10-03-2010 16:03 » 

Цитата
* Windows 2003 Server
* MySQL 5.0.24a
...
* MySQL ODBC Connector 3.51.24
Срочно обновиться!
Текущая версия сервера - 5.0.90, а коннектора - 5.1.6.
http://downloads.mysql.com/archives/mysql-5.0/mysql-essential-5.0.90-win32.msi
http://dev.mysql.com/downloads/mirror.php?id=376346#mirrors

Транзакция завершается в следующих случаях (для условий с выключенным auto_commit, либо явно открытой транзакцией):
1. COMMIT/ROLLBACK
2. Любая команда, приводящая к завершению транзакции (попытка COMMIT): http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html
3. Завершение сессии (происходит ROLLBACK).

В контексте PHP стоит помнить, что есть постоянные подключения (функция mysql_pconnect), которые не завершают сессию MySQL при завершении PHP-программы. Если не пользоваться этим, то сессия завершится. Но mysql_pconnect позволяет снизить латентность приложения.

Не слышал, чтобы ODBC-драйвер поддерживал постоянные подключения.

Вообще, логично было бы перехватывать исключения и откатывать транзакцию и не логично - пускать на самотек.

Насчет размера транзакции: он ограничен размером лога Innodb.
« Последнее редактирование: 10-03-2010 16:08 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #2 : 10-03-2010 18:39 » 

Вот про auto_commit - он автоматически включается на уровне настроек базы же? И commit выполняется после каждого запроса?

И про сессии - я не получил ответ - если начал одну транзакцию в одной сессии с юзером user, а в это время параллельно началась, выполнилась и завершилась другая сессия с тем же юзером - не повлияет ли она на транзакцию в первой сессии, если в ней (во второй) выполнялся commit ? Ответ подозреваю сам (не должно!), но хотелось бы на всякий случай убедиться..

Про размер транзакции - спасибо, очень ценное замечание.

mysql_pconnect() не использую.. возможно, перейду на что-то типа ADODB для php, но это будет уже другая история..
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 10-03-2010 19:20 » 

auto_commit устанавливается в настройках, но может быть изменен на уровне сессии. По дефолту он включен. Да, это приводит к виртуальному оборачиванию каждого DML-оператора другими операторами: START TRANSACTION и COMMIT. Если транзакцию открыть явно (START TRANSACTION), то auto_commit не действует до ее завершения.

Про сессии.

Если сессия закрылась, то автоматом выполняется ROLLBACK.
Если сессия не закрылась (при использовании постоянных соединений в PHP посредством mysql_pconnect), то транзакция продолжает существовать. Соотв., повторный START TRANSACTION приведет к ошибке.

Две параллельные сессии друг на друга не влияют. Но транзакции взаимодействуют между собой согласно установленному режиму (см. SET TRANSACTION ISOLATION LEVEL). По умолчанию в MySQL используется режим REPEATABLE READ.
http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html
« Последнее редактирование: 10-03-2010 19:24 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 10-03-2010 19:21 » new

baldr, commit действует на момент транзакции user'а. (ну... ты сам знал ответ)
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 10-03-2010 19:23 » 

Слав, а не понятно, что он говорит. Улыбаюсь Потому даю несколько ответов.

Все же про SET TRANSACTION рекомендую почитать. чтобы знать, какой реакции от базы ожидать.
« Последнее редактирование: 10-03-2010 19:28 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #6 : 10-03-2010 19:42 » 

Sla, минутку... Так юзера или сессии??
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 10-03-2010 19:48 » 

baldr, юзер+сессия
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 10-03-2010 19:51 » 

Юзер вообще побоку - это лишь авторизация. Для транзакций важны сессии и блокировки.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #9 : 10-03-2010 19:53 » 

RXL, Sla, спасибо, буду пробовать.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 10-03-2010 19:54 » 

RXL, согласен, что юзер - фигня
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 10-03-2010 19:55 » 

Точнее: транзакция работает в рамках одной сессии и взаимодействует с другими транзакциями посредством блокировок.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 10-03-2010 20:01 » 

Я слаб в блокировках mysql, у Том Кейта это описано очень хорошо.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 10-03-2010 20:05 » 

Слав, погоди, если мне не изменяет память, Том Кейт - спец по Оракл, а не по MySQL...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 10-03-2010 20:06 » 

RXL, не изменяет, конечно.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 10-03-2010 20:13 » 

Я обычно ищу просветления в документации: The InnoDB Transaction Model and Locking.

Есть еще раздел internals, где всякие тонкости рассказаны:
http://forge.mysql.com/wiki/MySQL_Internals
http://forge.mysql.com/wiki/MySQL_Internals_Transaction_management

Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #16 : 10-03-2010 20:23 » 

RXL, не забываем про распределенные транзакции, не знаю конечно как в MySQL, есть они?

Sla, RXL, не Том Кейт, а Том Кайт!

И да он специалист по Oracle, хоть мы и говорим об одних сущностях, но все таки нотации разные!
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 10-03-2010 20:25 » 

Есть, но я с ними не разбирался.
http://dev.mysql.com/doc/refman/5.0/en/xa.html
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #18 : 10-03-2010 20:26 » 

тогда вот это не совсем верно.

Точнее: транзакция работает в рамках одной сессии...
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 10-03-2010 20:57 » 

Макс, посмотри по ссылке - там совсем другие команды.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines