За последние 24 часа нас посетили 124323 программиста и 2537 роботов. Сейчас ищет 2171 программист ...

MySQL - транзакции

Тема в разделе "Прочие вопросы по PHP", создана пользователем Silicium, 14 апр 2008.

  1. Silicium

    Silicium Активный пользователь

    С нами с:
    1 апр 2008
    Сообщения:
    205
    Симпатии:
    0
    Адрес:
    Киев
    Возникла необходимость использовать MySQL - транзакции, как это делать понимаю смутно, вот пробовал такое:

    SELECT GET_LOCK ('COST ON ITEMS.ID = 3', 60);
    UPDATE ITEMS SET COST = 3.142 WHERE ID = 3;
    SELECT RELEASE_LOCK ('COST ON ITEMS.ID = 3');

    на запрос выдает ошибку FUNCTION ITEMS.GET_LOCK does not exist

    база типа InnoDB, Мускул версии 5.0.45
     
  2. Silicium

    Silicium Активный пользователь

    С нами с:
    1 апр 2008
    Сообщения:
    205
    Симпатии:
    0
    Адрес:
    Киев
    Нашел решение, вопрос как протестить?

    select for update блокирует другой select for update если данные пересекаются, ну и конечно блокирует update и delete этих строк
     
  3. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Silicium
    [sql]START TRANSACTION;
    bla bla bla;
    balblabla2;
    .......
    bla bla bla N;
    COMMIT;[/sql]
     
  4. Silicium

    Silicium Активный пользователь

    С нами с:
    1 апр 2008
    Сообщения:
    205
    Симпатии:
    0
    Адрес:
    Киев
    А лочится вся таблица или только записи с которым работает запрос?
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    А есть кстати мануальчик по транзакциям? ;)
     
  6. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
  7. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Транзакции в MySQL пока себя не оправдывают, имхо. Лучше просто лочить табличку.
    Кто-нибудь использует транзакции в своих проектах (mysql)?
     
  8. Silicium

    Silicium Активный пользователь

    С нами с:
    1 апр 2008
    Сообщения:
    205
    Симпатии:
    0
    Адрес:
    Киев
    Вопрос такого плана, а пока одна транзакция не выполнится все другие запросы и транзакции стоят в очереди?
     
  9. Silicium

    Silicium Активный пользователь

    С нами с:
    1 апр 2008
    Сообщения:
    205
    Симпатии:
    0
    Адрес:
    Киев
    Я использую, так как нужно разыгрывать призы, и не хочеться один приз разыграть дважды...
     
  10. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Silicium
    Эээммм... а почему бы на поле не поставить поле 'gifted', которое отвечает, что приз уже подарен? :)
     
  11. Silicium

    Silicium Активный пользователь

    С нами с:
    1 апр 2008
    Сообщения:
    205
    Симпатии:
    0
    Адрес:
    Киев
    объясняю!
    проверяем подарен ли приз? и дарим его, а теперь ситуация, что в это время кто-то проверил этот же приз и он не подарен и тоже дарим его только другому пользователю, тоесть ты понял что запросы могут пройти в не той последовальности. что нам нужно, сначала две проверки, а потом два подарка, а не проверка подарок, проверка подарок

    надеюсь понятно изъяснился :)
     
  12. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    А если так:
    .... WHERE `gift_id`=... and `gifted` IS NULL
    ?
     
  13. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Silicium
    Читать что есть транзакции и для чего они применяются.
    В твоей ситуации тебе нужна блокировка таблиц (см. LOCK TABLES)

    Ещё это http://dev.mysql.com/doc/refman/5.0/en/ ... reads.html
     
  14. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
    А руками проверить слабо?

    Запускаем одновременно двух клиентов.
    В одном делаем


    mysql> use test;
    Database changed
    mysql> create table abc (a int primary key, b varchar(5)) engine=innodb;
    Query OK, 0 rows affected (0.08 sec)

    mysql> set autocommit = 0;
    Query OK, 0 rows affected (0.02 sec)

    mysql> start transaction;
    Query OK, 0 rows affected (0.00 sec)

    mysql> insert into abc (a,b) values (1, 'q'), (2, 'w'), (3, 'e');
    Query OK, 3 rows affected (0.05 sec)
    Records: 3 Duplicates: 0 Warnings: 0

    mysql>

    Для танкистов. Отключаем автоматический COMMIT транзакций, стартуем транзакцию, вставляем три записи.
    Имеем незавершенную транзакцию.

    После этого во втором клиенте


    mysql> use test;
    Database changed
    mysql> select * from abc;
    Empty set (0.01 sec)

    Таблица ПУСТАЯ, транзакция не записана.


    mysql> insert into abc (a,b) values (4, 'r');
    Query OK, 1 row affected (0.02 sec)

    Добавлять без проблем.


    mysql> select * from abc;
    +---+------+
    | a | b |
    +---+------+
    | 4 | r |
    +---+------+
    1 row in set (0.00 sec)

    mysql>

    Видим ТОЛЬКО запись добавленную во втором клиенте.


    Возвращаемся в первого клиента, записываем транзакцию

    mysql> COMMIT;
    Query OK, 0 rows affected (0.03 sec)

    mysql>


    Снова во второго

    mysql> select * from abc;
    +---+------+
    | a | b |
    +---+------+
    | 1 | q |
    | 2 | w |
    | 3 | e |
    | 4 | r |
    +---+------+
    4 rows in set (0.02 sec)

    mysql>

    PS. Уровень изоляции стоял по умолчанию Repeatable Read
    PSS. Для лучшего понимания попробуй в моем примере вставить со второго клиента не
    insert into abc (a,b) values (4, 'r');
    а вот это
    insert into abc (a,b) values (3, 'r');

    Посмотри что получиться, запиши транзакцию на первом и посмотри что на это скажет второй.
    PSSS. Нормально транзакции работают. Если понимать как. Ну и error'ы отрабатывать.
     
  15. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Silicium
    Не понятно...
    Если нужно запретить одновременные обращения к таблице - закрой ее на запись/чтение
     
  16. Silicium

    Silicium Активный пользователь

    С нами с:
    1 апр 2008
    Сообщения:
    205
    Симпатии:
    0
    Адрес:
    Киев
    уж очень много посетителей будет, боюсь что потеряю многих...
     
  17. Silicium

    Silicium Активный пользователь

    С нами с:
    1 апр 2008
    Сообщения:
    205
    Симпатии:
    0
    Адрес:
    Киев
    EugeneTM
    Большущее спасибо :)