Forum Webscript.Ru
Программирование => PHP => Тема начата: Evgeny от 22 Июля 2002, 19:49:35
-
Привет всем!
Пишу небольшой скрипт, который является интерфейсом к БД (ifx). С добавлением записей всё просто.
Не пойму, как можно сделать апдейт и удаление.
Опишу то, что хотелось бы иметь.
Пользователь задаёт некий критерий поиска, выдаю ему соответствующие записи (скажем некое множество А). С этого момента их нужно как-то заблокировать (каждая запись имеет ID), с тем чтобы другие пользователи, пока данный работает, не могли удалить или изменить выбранные данные множества А.
Варианты решений:
1) В начале удаления или апдейта создаётся какой-нибудь файл lock.tmp, который удаляется по завершении транзакции.
Остальные пользователи ждут, пока не удалится файл lock.tmp и лишь тогда могут приступить к удалению или апдейту.
Минус - пользователь обязательно не нажмёт "Закончить апдэйт", а просто закроет броузер, lock.tmp останется неудалённым, больше никто не сможет работать.
Решение - как-нибудь привесить с событию "Завершение сессии" функцию удаления lock.tmp (прошу прощения за объектно-ориентированную терминологию).
Вопрос - как это можно сделать, если можно? (поймать событие завершения сессии)
2) Воспользоваться средствами самой БД и как-нибудь заблокировать выбранные данные. Опять же до завершения сессии или на определённые период.
Вопрос - как это можно сделать, если можно?
3) Положиться на удачу и предположить, что пересечений пользователей по время удалений и апдэйтов не будет.
:(
А вообще как это реализуется? Кто-нибудь решал подобные задачи?
-
мнэээ....не советую заниматься транзакцими на такой почве, как HTTP
Ты правильно видишь подводные камни.
а база твоя не поддерживает транзакции?
-
мнэээ....не советую заниматься транзакцими на такой почве, как HTTP
Ты правильно видишь подводные камни.
а база твоя не поддерживает транзакции?
База - ifx. Это всё, что я о ней знаю. Но ведь в любом случае через http прийдётся обзначать начало и конец транзакции.
Я занимаюсь этим в первый раз, интересно, как это другие реализуют?
-
Взять хотя бы этот форум. Как решается проблема того, что если я захочу к примеру отредактировать моё собщение, а администратор в это же самое время - удалить?
-
LOCK TABLES tbl_name [AS alias] {READ | [READ LOCAL] | [LOW_PRIORITY] WRITE}
[, tbl_name {READ | [LOW_PRIORITY] WRITE} ...]
...
UNLOCK TABLES
Это MySQL
read- запрещена запись, читать могут
write полная блокировка
-
ИМХО вообще неудачная организация работы скрипта. Что это за данные, которые может в любой момент может удалить любой пользователь.
Взять хотя бы этот форум. Как решается проблема того, что если я захочу к примеру отредактировать моё собщение, а администратор в это же самое время - удалить?
Либо сначало ты его изменишь а потом оно будет удалено либо оно сразу буде удалено а ты получишь сообщение об ошибке. Все зависит от того кто шустрее :)
-
Либо сначало ты его изменишь а потом оно будет удалено либо оно сразу буде удалено а ты получишь сообщение об ошибке. Все зависит от того кто шустрее
А если оно будет удалено, а в это время - добавлено новое, с тем же АйДи, то я получается его (новое) перезапишу?
-
И ещё вопрос. Как решается проблема того, что если юзер таблицу заблокирует, а потом, броузер закроет (не разблокировав данные)?
-
все установленные клиентом блокировки автоматически снимаются при завершении сеанса его работы
-
Evgeny
Так надо уникальный айди делать.
в mysql все просто - там по умолчанию числовое автоинкрементное поле, каждая новая запись имеет уникальный ид.
А под саенсом работы пользователя имеется в виду завершение работы скрипта. Не уход пользователя с сайта и не время ,когда он увидел сврою страниуц. А именно завершение работы скрипта.
-
RomikChef
Так надо уникальный айди делать.
У меня в тавлице есть поле - автоматический счётчик. Оно не может повторяться? Если например запись с номером N была удалена, новая запись не может получить этот номер?
А именно завершение работы скрипта.
А если скрипт повис, цикл например безконечный, то получается пользователь не может завершить его работу закрытием браузера?
-
1. нет, не может. Там тоже не дураки сидят :-)
2. Какие проблемы??? А ты пиши скрипты без бесконечных цикклов. Вот я, например - так и пишу всегда.
по умолчанию РНР сам прибьет скрипт, который выпоняется дольше 30 секунд. Это число можно изменить.
-
RomikChef
1. нет, не может. Там тоже не дураки сидят :-)
А каким может быть максимальное значение этого счётчика? Ведь рано или поздно значение подойдёт к максимальному. И что тогда?
РНР сам прибьет скрипт, который выпоняется дольше 30 секунд. Это число можно изменить
А как его изменить?
И ещё впрос. Его наверное в форум по БД писать надо, но вдруг здесь ответ получу, зря новый топик создавать не буду.
К БД я подключаюсь ф-цией ifx_connect. Это значит что у меня БД ifx используется? Как можно заблокировать определённую
запись, в которой, к примеру, поле ID равно 100?
Что произойдёт, если скрипт попытается обратиться к заблокированной записи? Получит ли он определённый код ошибки или приостановится, а может быть БД вообще просто не выдаст его без каких-либо сообщений?
-
Какого типа поле будет - столько и id
Не боись - тебе хватит.
В Informix-е есть транзакции, так что можешь юзать их.
И не ходи по форумам, а купи книжку сразу.