Здравствуйте, появилось необходимость в следующем:
У нас есть несколько редакторов, и есть свой движок для редактирования ячеек из базы данных, все написано на пхп+mysql, возникает перезапись когда редакторы получают одни и те же данные из базы данных (обновляют страницу), соответственно, нужно придумать какой нибудь фикс, чтобы ID полученных данных у одного редактора не повторялась у другого.
Если задача "не открыть второму" - то при открытии писать в табличку что открыто, кем и когда. периодически обновлять, при закрытии - удалять из этой таблички. Или протухании времени, допустим, обновлять раз в 10 секунд, при протухании больше минуты - форсированно удалять (вариант потери связи).
Если задача "не сохранить второму" - то завести поле "версия", перед записью вносить изменения через сравнение ид и версии, типа update ... set version = version+1 ... where id = 1 and version = 1. если 0 строк обновлено - то кто-то до нас туда записал что-то. также можно периодически проверять на изменение версии и сигнализировать об этом "второму" редактору.
Также возможна любая комбинация этих методов и некоторые другие, которые сводятся к этим двум и их комбинации.
Задача "не открыть второму", то бишь чтобы они не редактировали одно и тоже. Ваш вариант уже рассматривался, и ищем другие варианты, так как наши работники могут открыть страницу и начать редактировать через час, а то и больше)
так как наши работники могут открыть страницу и начать редактировать через час
Вариант @Fragster на "не открытие" вполне оптимальный. Например, если редактирование через веб интерфейс, то метку об открытии можно поддерживать переодическим аяксом, например раз в минуту записывая таймштамп, а на крон повесить задание, что если запись не обновлялась 5 минут, то ставить статус "Закрыта" . Минусы конечно есть в данном способе, например если коннект отвалился, или сервер загружен, но опять-же можно на клиенте дополнительно следить, что если несколько раз не прошло обновление, физически закрывать таблицу.
@gibigate вроде бы эти все селекторы и блокировки работают в транзакции, держать же транзакцию на все время редактирования - это ужас, да и вряд-ли получится.
Привет, это классический случай параллельного доступа к данным. Вариантов решения масса. Один из самых простых и надежных: использовать локи (lock) таблиц, строк, ячеек в БД. Вот в PostgreSQL, например.