powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Транзакции в MySQL (?)
8 сообщений из 8, страница 1 из 1
Транзакции в MySQL (?)
    #33428248
Denlerien
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Предупреждение - я новичок в MySQL, баз еще никаких нет, так что принимаются и советы по поводу того, в каком формате данные использовать.

Ситуация.
Пользователь А делает выборку данных, затем решает изменить какуе-то запись.
Пользователь Б делает выборку данных и решает изменить ту же запись.
Пользователь А вносит изменения.
Пользователь Б пытается также внести изменения (естественно, не зная о том, что пользователь А уже корректировал запись).

Если я не ошибаюсь, в MSSQL Server в таком случае пользователю Б выдается ошибка, сигнализирующая о том, что нужно сделать повторную выборку.

Если не предпринимать в MySQL ничего, в смысле строить все по умолчанию, то пользователь Б спокойно внесет изменения и не получит никаких предупреждений.

Когда я пытался ввести транзакции, ввод изменений пользователем Б просто откладывался до того момента, когда пользователь А закончит транзакцию.

Каким образом можно разрешить данный конфликт?

P.S. Чем отличаются типы таблиц и как делать бэкап базы (ссылочу, если можно).
P.P.S. Я бы, конечно, и сам нашел про типы и бэкап, но времени нет, а так может на какие подводные камни укажете...
...
Рейтинг: 0 / 0
Транзакции в MySQL (?)
    #33428394
Фотография Хрен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select ... for update
...
Рейтинг: 0 / 0
Транзакции в MySQL (?)
    #33428492
Denlerien
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И что? Вот пример:
Пусть имеется таблица pet с полями name, owner (для простоты будем считать что поле name уникально)
user a> select * from pet for update;
user b> select * from pet for update;
user a> update pet set owner='Den' where name='Kitty';
user b> update pet set owner='Mike' where name='Kitty';

По идее, последний запрос сработать не должен, но если все применять по умолчанию, то он работает. Как перобразовать последовательность запросов и/или выбрать тип таблицы, настроить сервер чтобы работало как надо? Или может я select ... for update неправильно использую?

p.s. user a - администратор (root), user b - имеет доступ только к данной базе, если это имеет значение.
p.p.s если испльзовать вместо select for update простой select - результат тот же.
...
Рейтинг: 0 / 0
Транзакции в MySQL (?)
    #33428513
Denlerien
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, в MS SQL Server тоже в виде запросов не работает. Я использовал ADO, при этом генерировался более сложный код запросов, а именно
SET NO_BROWSETABLE ON/OFF
и
exec [test]..sp_indexes_rowset N'Pet', NULL, NULL.

Как это работает и что это означает я не знаю, может поможете? :)
...
Рейтинг: 0 / 0
Транзакции в MySQL (?)
    #33428577
Фотография Хрен
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://dev.mysql.com/doc/refman/4.0/ru/innodb-locks-set.html

http://dev.mysql.com/doc/refman/4.0/ru/internal-locking.html

http://dev.mysql.com/doc/refman/4.0/ru/lock-tables.html
...
Рейтинг: 0 / 0
Транзакции в MySQL (?)
    #33428773
Denlerien
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, буду разбираться. В общем, как всегда - RTFM. :-)
...
Рейтинг: 0 / 0
Транзакции в MySQL (?)
    #33434184
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем...
Почему бы пользователю Б не дать изменить данные после пользователя А? ведь пользователь отработал свои изменения.... так что на самом деле вопрос риторический, и сказать что в MSSQL предлагать пользователю сделать обновления датасета только оттого что кто-то "влез" до его поста - это лучше... это по меньшей мере спорно, не глюк ли это? или невозможность номальной реализации?
ЧИТАТЬ нужно изоляцию транзакций, а не как это работает в MSSQL, например в ORACLE такого глюка нет, и пользователь Б внесет информацию...

Да и вероятность такого совпадения достаточно невелика...

А если например пользователь Б прав и вносит большой кусок текста, а ему потом сервер берет и сбрасывает транзакцию? это разве логично? Нормальный Юзверь будет возмущен и будет звонить в службу поддержки, чтобы исправили ошибку...
...
Рейтинг: 0 / 0
Транзакции в MySQL (?)
    #33434747
Marat_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denlerien
user a> select * from pet for update;
user b> select * from pet for update;
user a> update pet set owner='Den' where name='Kitty';
user b> update pet set owner='Mike' where name='Kitty';

По идее, последний запрос сработать не должен, но если все применять по умолчанию, то он работает.
Код: plaintext
1.
2.
3.
4.
5.
user a> START TRANSACTION;  <<<<<<
user b> START TRANSACTION;  <<<<<<
user a> select * from pet for update;
user b> select * from pet for update; <<< Здесь должно срезаться
user a> update pet set owner='Den' where name='Kitty';
user b> update pet set owner='Mike' where name='Kitty';
По моему это то, что тебе нужно.
Кстати, select * from pet for update будет блокировать всю таблицу. Желательно блокировать только нужную запись.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Транзакции в MySQL (?)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]