Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Блокировка данных


Автор: bagos 6.9.2011, 14:48
Всем привет, в пхп новичок да и с бд mysql мало знаком. Делаю простенький движок для сайта. Проектируя бд, встал вопрос: существует ли какая то блокировка таблиц или записей, ведь если один пользователь изменяет данные, а другой в это время тоже захочет их изменить, то получится белеберда в базе. Уверен что есть какие то инструменты или операторы позволяющие делать "блокировку". В какую сторону копать что читать. Заранее спасибо. Буду рад любой полезной информации.

Добавлено через 5 минут и 32 секунды
для подключения к бд и работе с запросами использую библиотеку dbsimple http://dklab.ru/lib/DbSimple/manual.html
можно ли с помощью нее производить блокировку?

Автор: solenko 6.9.2011, 16:46
читать, как обычно, в сторону мануала http://dev.mysql.com/doc/refman/5.1/en/innodb-transaction-model.html

Автор: MuToGeN 6.9.2011, 18:05
1. Блокировка существует
2. В случае MySQL этим вопросом занимается сам MySQL (велосипедов изобретать не стоит)
3. Нюансы зависят от движка (к примеру, table-level locking в случае MyISAM и row-level locking для InnoDB)

Автор: bagos 20.9.2011, 11:57
Попробую более детально описать задачу чтобы вы мне точно могли ответить нужна ли вообще в моем случае блокировка.
Схема проста:
1) Есть таблица пользователей users (id, login, pass, etc....)
2) Есть таблица новостей news (id, title, text, date, author_id, ...etc...)
Каждый из пользователей может добавлять новости, скажем их 10-20 и каждый вносит в базу отсебятину. При этом они могут изменять\добавлять\удалять записи.
Добавляться записи будут часто, удаляться и редактироваться крайне редко.

Нужны ли в таких случаях механизмы блокировок?

новости выводятся на страницу для простых пользователей select * from news;

зарег. пользователям новости также выводятся select * from news, апдейтятся UPDATE news SET title,..... WHERE id=?
использую MySQLi

хотелось бы реальный примерчик, уверен многие с этим сталкивались и могут поделиться опытом

и да мануал читал в инете шарился, инфы почему то мало :(

На дом. компьютере стоит денвер, знаю что не лучший вариант. InnoDb отключен

Автор: MuToGeN 22.9.2011, 11:37
Обычно решается следующим образом:
В таблицу news добавляем два поля, типа locked_by INT и locked_date DATETIME
При открытии в админке формы для редактирования новости в первое поле пишем id юзера, во второе - NOW().
При выдаче списка новостей со ссылками "редактировать" проверяем locked_by и locked_date (допустим, если было залочено более часа назад, то считаем, что юзер открыл страницу редактирования и закрыл вкладку браузера) и в случае чего пишем, мол, "в данный момент поправить не судьба, т.к. эту новость правит кто-то другой".
Соответственно, сохранить может только тот, на кого залочено (или кто угодно, если запись считаем разлоченной по таймауту).
Вот как-то так.

Автор: bagos 22.9.2011, 14:26
Спасибо, MuToGeN, думаю так и сделаю.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)