Forum Webscript.Ru

Программирование => PHP => Тема начата: Evgeny от 22 Июля 2002, 19:49:35

Название: Транзакции.
Отправлено: Evgeny от 22 Июля 2002, 19:49:35
Привет всем!
Пишу небольшой скрипт, который является интерфейсом к БД (ifx). С добавлением записей всё просто.
Не пойму, как можно сделать апдейт и удаление.
Опишу то, что хотелось бы иметь.
Пользователь задаёт некий критерий поиска, выдаю ему соответствующие записи (скажем некое множество А). С этого момента их нужно как-то заблокировать (каждая запись имеет ID), с тем чтобы другие пользователи, пока данный работает, не могли удалить или изменить выбранные данные множества А.
Варианты решений:
1) В начале удаления или апдейта создаётся какой-нибудь файл lock.tmp, который удаляется по завершении транзакции.
Остальные пользователи ждут, пока не удалится файл lock.tmp и лишь тогда могут приступить к удалению или апдейту.
Минус - пользователь обязательно не нажмёт "Закончить апдэйт", а просто закроет броузер, lock.tmp останется неудалённым, больше никто не сможет работать.
Решение - как-нибудь привесить с событию "Завершение сессии" функцию удаления lock.tmp (прошу прощения за объектно-ориентированную терминологию).
Вопрос - как это можно сделать, если можно? (поймать событие завершения сессии)

2) Воспользоваться средствами самой БД и как-нибудь заблокировать выбранные данные. Опять же до завершения сессии или на определённые период.
Вопрос - как это можно сделать, если можно?

3) Положиться на удачу и предположить, что пересечений пользователей по время удалений и апдэйтов не будет.
:(

А вообще как это реализуется? Кто-нибудь решал подобные задачи?
Название: Транзакции.
Отправлено: Меняздесьдавнонет от 22 Июля 2002, 20:07:52
мнэээ....не советую заниматься транзакцими на такой почве, как HTTP
Ты правильно видишь подводные камни.
а база твоя не поддерживает транзакции?
Название: Транзакции.
Отправлено: Evgeny от 22 Июля 2002, 20:30:09
Цитировать
мнэээ....не советую заниматься транзакцими на такой почве, как HTTP
Ты правильно видишь подводные камни.
а база твоя не поддерживает транзакции?

База - ifx. Это всё, что я о ней знаю. Но ведь в любом случае через http прийдётся обзначать начало и конец транзакции.
Я занимаюсь этим в первый раз, интересно, как это другие реализуют?
Название: Транзакции.
Отправлено: Evgeny от 22 Июля 2002, 20:31:19
Взять хотя бы этот форум. Как решается проблема того, что если я захочу к примеру отредактировать моё собщение, а администратор в это же самое время - удалить?
Название: Транзакции.
Отправлено: Covex от 22 Июля 2002, 20:53:33
LOCK TABLES tbl_name [AS alias] {READ | [READ LOCAL] | [LOW_PRIORITY] WRITE}
            [, tbl_name {READ | [LOW_PRIORITY] WRITE} ...]
...
UNLOCK TABLES

Это MySQL
read- запрещена запись, читать могут
write  полная блокировка
Название: Транзакции.
Отправлено: Макс от 22 Июля 2002, 22:36:48
ИМХО вообще неудачная организация работы скрипта. Что это за данные, которые может в любой момент может удалить любой пользователь.

Цитировать
Взять хотя бы этот форум. Как решается проблема того, что если я захочу к примеру отредактировать моё собщение, а администратор в это же самое время - удалить?
Либо сначало ты его изменишь а потом оно будет удалено либо оно сразу буде удалено а ты получишь сообщение об ошибке. Все зависит от того кто шустрее :)
Название: Транзакции.
Отправлено: Evgeny от 23 Июля 2002, 11:43:45
Цитировать
Либо сначало ты его изменишь а потом оно будет удалено либо оно сразу буде удалено а ты получишь сообщение об ошибке. Все зависит от того кто шустрее

А если оно будет удалено, а в это время - добавлено новое, с тем же АйДи, то я получается его (новое) перезапишу?
Название: Транзакции.
Отправлено: Evgeny от 23 Июля 2002, 11:46:18
И ещё вопрос. Как решается проблема того, что если юзер таблицу заблокирует, а потом, броузер закроет (не разблокировав данные)?
Название: Транзакции.
Отправлено: Covex от 23 Июля 2002, 11:55:03
Цитировать
все установленные клиентом блокировки автоматически снимаются при завершении сеанса его работы
Название: Транзакции.
Отправлено: Меняздесьдавнонет от 23 Июля 2002, 12:24:27
Evgeny
Так надо уникальный айди делать.
в mysql все просто - там по умолчанию числовое автоинкрементное поле, каждая новая запись имеет уникальный ид.

А под саенсом работы пользователя имеется в виду завершение работы скрипта. Не уход пользователя с сайта и не время ,когда он увидел сврою страниуц. А именно завершение работы скрипта.
Название: Транзакции.
Отправлено: Evgeny от 23 Июля 2002, 12:42:32
RomikChef
Цитировать
Так надо уникальный айди делать.

У меня в тавлице есть поле - автоматический счётчик. Оно не может повторяться? Если например запись с номером N была удалена, новая запись не может получить этот номер?

Цитировать
А именно завершение работы скрипта.

А если скрипт повис, цикл например безконечный, то получается пользователь не может завершить его работу закрытием браузера?
Название: Транзакции.
Отправлено: Меняздесьдавнонет от 23 Июля 2002, 12:57:10
1. нет, не может. Там тоже не дураки сидят :-)
2. Какие проблемы??? А ты пиши скрипты без бесконечных цикклов. Вот я, например - так и пишу всегда.
по умолчанию РНР сам прибьет скрипт, который выпоняется дольше 30 секунд. Это число можно изменить.
Название: Транзакции.
Отправлено: Evgeny от 23 Июля 2002, 14:37:04
RomikChef
Цитировать
1. нет, не может. Там тоже не дураки сидят :-)

А каким может быть максимальное значение этого счётчика? Ведь рано или поздно значение подойдёт к максимальному. И что тогда?
Цитировать
РНР сам прибьет скрипт, который выпоняется дольше 30 секунд. Это число можно изменить

А как его изменить?

И ещё впрос. Его наверное в форум по БД писать надо, но вдруг здесь ответ получу, зря новый топик создавать не буду.
К БД я подключаюсь ф-цией ifx_connect. Это значит что у меня БД ifx используется? Как можно заблокировать определённую
запись, в которой, к примеру, поле ID равно 100?
Что произойдёт, если скрипт попытается обратиться к заблокированной записи? Получит ли он определённый код ошибки или приостановится, а может быть БД вообще просто не выдаст его без каких-либо сообщений?
Название: Транзакции.
Отправлено: Меняздесьдавнонет от 23 Июля 2002, 15:31:03
Какого типа поле будет - столько и id
Не боись - тебе хватит.

В Informix-е  есть транзакции, так что можешь юзать их.
И не ходи по форумам, а купи книжку сразу.