оптимистичные и пессимистичные замки - PullRequest
4 голосов
/ 20 мая 2010

Работая над моим первым проектом php / Codeigniter, я искал в сети информацию о блокировке доступа к редактированию данных и не нашел очень много информации.

Я ожидаю, что 2 пользователя будут пытаться редактировать одну и ту же форму одновременно.

По моему опыту (в мире состояний BBx, filePro и других приложений RAD) редактируемые данные блокируются с помощью пессимистичной блокировки - один пользователь имеет доступ к форме редактирования в данный момент. Второй пользователь в основном должен ждать, пока первый закончит работу. Я понимаю, что это можно сделать с помощью Ajax, отправляющего XMLHttpRequests для поддержки базы данных «lock».

Мир php, которому не хватает состояния, похоже, предпочитает оптимистическую блокировку. Если я правильно понимаю, это работает так: оба пользователя получают доступ к данным, и каждый из них записывает версию данных «до изменений». Перед сохранением их изменений данные снова извлекаются и сравниваются с версией «до изменений». Если две версии идентичны, то изменения пользователей записываются. Если они разные; пользователю показано, что изменилось с тех пор, как он / она начал редактировать, и добавлен какой-то механизм для устранения различий, или пользователю отображается сообщение «Извините, попробуйте еще раз».

Мне интересен любой опыт, который люди здесь имели при реализации как пессимистической, так и оптимистической блокировки. Если есть какие-либо библиотеки, инструменты или инструкции, я буду благодарен за ссылку.

Спасибо

Ответы [ 2 ]

2 голосов
/ 14 декабря 2010

Насколько я знаю, CodeIgniter не поддерживает блокировку строк. Если вы хотите реализовать оптимистическую блокировку, вы должны добавить столбец версии или столбец отметки времени, который необходимо изменять при каждом обновлении / вставке. Поместите столбец версии в скрытое поле в ваших формах. Затем перед каждым обновлением добавляйте предложение where, например:

$this->db->where('version',$editedVersion);

или

$this->db->where('timestamp',$editedTimestamp);

И тогда вам следует убедиться, что обновление корректно обновило 1 строку ..

$this->db->where('id',$editedId);
$this->db->update('tablename',$data);
$rowsAffected = $this->db->affected_rows();
if ($rowsAffected == 0) {
    /* Data changed by other user, update failed */
} else {
   /* updated successfully */
}
0 голосов
/ 21 мая 2010

Если вы используете механизм хранения InnoDB, вы можете получить эксклюзивные блокировки на уровне строк с помощью операторов SELECT FOR UPDATE.

ВЫБРАТЬ ... ДЛЯ ОБНОВЛЕНИЯ и ВЫБРАТЬ ... БЛОКИРОВАТЬ В РЕЖИМЕ ОБЩЕГО ИСПОЛЬЗОВАНИЯ Блокировка чтения

Режимы блокировки InnoDB

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...