Возникла необходимость использовать 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
Нашел решение, вопрос как протестить? select for update блокирует другой select for update если данные пересекаются, ну и конечно блокирует update и delete этих строк
Транзакции в MySQL пока себя не оправдывают, имхо. Лучше просто лочить табличку. Кто-нибудь использует транзакции в своих проектах (mysql)?
Вопрос такого плана, а пока одна транзакция не выполнится все другие запросы и транзакции стоят в очереди?
Silicium Эээммм... а почему бы на поле не поставить поле 'gifted', которое отвечает, что приз уже подарен?
объясняю! проверяем подарен ли приз? и дарим его, а теперь ситуация, что в это время кто-то проверил этот же приз и он не подарен и тоже дарим его только другому пользователю, тоесть ты понял что запросы могут пройти в не той последовальности. что нам нужно, сначала две проверки, а потом два подарка, а не проверка подарок, проверка подарок надеюсь понятно изъяснился
Silicium Читать что есть транзакции и для чего они применяются. В твоей ситуации тебе нужна блокировка таблиц (см. LOCK TABLES) Ещё это http://dev.mysql.com/doc/refman/5.0/en/ ... reads.html
А руками проверить слабо? Запускаем одновременно двух клиентов. В одном делаем 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'ы отрабатывать.
Silicium Не понятно... Если нужно запретить одновременные обращения к таблице - закрой ее на запись/чтение