Автор Тема: Транзакции.  (Прочитано 5101 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Evgeny

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

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

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

А вообще как это реализуется? Кто-нибудь решал подобные задачи?

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Транзакции.
« Ответ #1 : 22 Июля 2002, 20:07:52 »
мнэээ....не советую заниматься транзакцими на такой почве, как HTTP
Ты правильно видишь подводные камни.
а база твоя не поддерживает транзакции?

Оффлайн Evgeny

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 272
  • +0/-0
  • 0
    • Просмотр профиля
Транзакции.
« Ответ #2 : 22 Июля 2002, 20:30:09 »
Цитировать
мнэээ....не советую заниматься транзакцими на такой почве, как HTTP
Ты правильно видишь подводные камни.
а база твоя не поддерживает транзакции?

База - ifx. Это всё, что я о ней знаю. Но ведь в любом случае через http прийдётся обзначать начало и конец транзакции.
Я занимаюсь этим в первый раз, интересно, как это другие реализуют?

Оффлайн Evgeny

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 272
  • +0/-0
  • 0
    • Просмотр профиля
Транзакции.
« Ответ #3 : 22 Июля 2002, 20:31:19 »
Взять хотя бы этот форум. Как решается проблема того, что если я захочу к примеру отредактировать моё собщение, а администратор в это же самое время - удалить?

Оффлайн Covex

  • Только встал и уже устал.
  • Постоялец
  • ***
  • Сообщений: 208
  • +0/-0
  • 2
    • Просмотр профиля
Транзакции.
« Ответ #4 : 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  полная блокировка

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Транзакции.
« Ответ #5 : 22 Июля 2002, 22:36:48 »
ИМХО вообще неудачная организация работы скрипта. Что это за данные, которые может в любой момент может удалить любой пользователь.

Цитировать
Взять хотя бы этот форум. Как решается проблема того, что если я захочу к примеру отредактировать моё собщение, а администратор в это же самое время - удалить?
Либо сначало ты его изменишь а потом оно будет удалено либо оно сразу буде удалено а ты получишь сообщение об ошибке. Все зависит от того кто шустрее :)
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Evgeny

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 272
  • +0/-0
  • 0
    • Просмотр профиля
Транзакции.
« Ответ #6 : 23 Июля 2002, 11:43:45 »
Цитировать
Либо сначало ты его изменишь а потом оно будет удалено либо оно сразу буде удалено а ты получишь сообщение об ошибке. Все зависит от того кто шустрее

А если оно будет удалено, а в это время - добавлено новое, с тем же АйДи, то я получается его (новое) перезапишу?

Оффлайн Evgeny

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 272
  • +0/-0
  • 0
    • Просмотр профиля
Транзакции.
« Ответ #7 : 23 Июля 2002, 11:46:18 »
И ещё вопрос. Как решается проблема того, что если юзер таблицу заблокирует, а потом, броузер закроет (не разблокировав данные)?

Оффлайн Covex

  • Только встал и уже устал.
  • Постоялец
  • ***
  • Сообщений: 208
  • +0/-0
  • 2
    • Просмотр профиля
Транзакции.
« Ответ #8 : 23 Июля 2002, 11:55:03 »
Цитировать
все установленные клиентом блокировки автоматически снимаются при завершении сеанса его работы

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Транзакции.
« Ответ #9 : 23 Июля 2002, 12:24:27 »
Evgeny
Так надо уникальный айди делать.
в mysql все просто - там по умолчанию числовое автоинкрементное поле, каждая новая запись имеет уникальный ид.

А под саенсом работы пользователя имеется в виду завершение работы скрипта. Не уход пользователя с сайта и не время ,когда он увидел сврою страниуц. А именно завершение работы скрипта.

Оффлайн Evgeny

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 272
  • +0/-0
  • 0
    • Просмотр профиля
Транзакции.
« Ответ #10 : 23 Июля 2002, 12:42:32 »
RomikChef
Цитировать
Так надо уникальный айди делать.

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

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

А если скрипт повис, цикл например безконечный, то получается пользователь не может завершить его работу закрытием браузера?

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Транзакции.
« Ответ #11 : 23 Июля 2002, 12:57:10 »
1. нет, не может. Там тоже не дураки сидят :-)
2. Какие проблемы??? А ты пиши скрипты без бесконечных цикклов. Вот я, например - так и пишу всегда.
по умолчанию РНР сам прибьет скрипт, который выпоняется дольше 30 секунд. Это число можно изменить.

Оффлайн Evgeny

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 272
  • +0/-0
  • 0
    • Просмотр профиля
Транзакции.
« Ответ #12 : 23 Июля 2002, 14:37:04 »
RomikChef
Цитировать
1. нет, не может. Там тоже не дураки сидят :-)

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

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

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

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Транзакции.
« Ответ #13 : 23 Июля 2002, 15:31:03 »
Какого типа поле будет - столько и id
Не боись - тебе хватит.

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

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28