|
|
|
Транзакции в MySQL (?)
|
|||
|---|---|---|---|
|
#18+
Предупреждение - я новичок в MySQL, баз еще никаких нет, так что принимаются и советы по поводу того, в каком формате данные использовать. Ситуация. Пользователь А делает выборку данных, затем решает изменить какуе-то запись. Пользователь Б делает выборку данных и решает изменить ту же запись. Пользователь А вносит изменения. Пользователь Б пытается также внести изменения (естественно, не зная о том, что пользователь А уже корректировал запись). Если я не ошибаюсь, в MSSQL Server в таком случае пользователю Б выдается ошибка, сигнализирующая о том, что нужно сделать повторную выборку. Если не предпринимать в MySQL ничего, в смысле строить все по умолчанию, то пользователь Б спокойно внесет изменения и не получит никаких предупреждений. Когда я пытался ввести транзакции, ввод изменений пользователем Б просто откладывался до того момента, когда пользователь А закончит транзакцию. Каким образом можно разрешить данный конфликт? P.S. Чем отличаются типы таблиц и как делать бэкап базы (ссылочу, если можно). P.P.S. Я бы, конечно, и сам нашел про типы и бэкап, но времени нет, а так может на какие подводные камни укажете... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2005, 17:57:12 |
|
||
|
Транзакции в MySQL (?)
|
|||
|---|---|---|---|
|
#18+
select ... for update ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2005, 19:16:40 |
|
||
|
Транзакции в MySQL (?)
|
|||
|---|---|---|---|
|
#18+
И что? Вот пример: Пусть имеется таблица 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 - результат тот же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2005, 20:42:00 |
|
||
|
Транзакции в MySQL (?)
|
|||
|---|---|---|---|
|
#18+
Да, в MS SQL Server тоже в виде запросов не работает. Я использовал ADO, при этом генерировался более сложный код запросов, а именно SET NO_BROWSETABLE ON/OFF и exec [test]..sp_indexes_rowset N'Pet', NULL, NULL. Как это работает и что это означает я не знаю, может поможете? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2005, 21:03:20 |
|
||
|
Транзакции в MySQL (?)
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2005, 21:56:39 |
|
||
|
Транзакции в MySQL (?)
|
|||
|---|---|---|---|
|
#18+
Спасибо, буду разбираться. В общем, как всегда - RTFM. :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2005, 10:52:20 |
|
||
|
Транзакции в MySQL (?)
|
|||
|---|---|---|---|
|
#18+
Не совсем... Почему бы пользователю Б не дать изменить данные после пользователя А? ведь пользователь отработал свои изменения.... так что на самом деле вопрос риторический, и сказать что в MSSQL предлагать пользователю сделать обновления датасета только оттого что кто-то "влез" до его поста - это лучше... это по меньшей мере спорно, не глюк ли это? или невозможность номальной реализации? ЧИТАТЬ нужно изоляцию транзакций, а не как это работает в MSSQL, например в ORACLE такого глюка нет, и пользователь Б внесет информацию... Да и вероятность такого совпадения достаточно невелика... А если например пользователь Б прав и вносит большой кусок текста, а ему потом сервер берет и сбрасывает транзакцию? это разве логично? Нормальный Юзверь будет возмущен и будет звонить в службу поддержки, чтобы исправили ошибку... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2005, 19:17:02 |
|
||
|
Транзакции в MySQL (?)
|
|||
|---|---|---|---|
|
#18+
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. Кстати, select * from pet for update будет блокировать всю таблицу. Желательно блокировать только нужную запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2005, 09:13:03 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=33434184&tid=1853298]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
210ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 220ms |
| total: | 533ms |

| 0 / 0 |
