Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / обновление данных в многопользовательском Веб-приложении / 25 сообщений из 39, страница 1 из 2
26.07.2006, 16:40
    #33880248
обновление данных в многопользовательском Веб-приложении
Коллеги, хочу открыть топик по проблеме обновления, удаления данных в многопользовательских приложениях.
Проблема такая.
Пользователь пытается добавить запись в таблицу в которой есть поля являющиеся внешними ключами. (причем есть констрайнт на данные ключи NOT NULL)
Если в момент добавления записи в таблицу значения одного из внешних ключей не валидно (эти записи были удалены другим пользователем), то получаем исключение.

Кто и как борется с данной проблемой?

Спасибо.
...
Рейтинг: 0 / 0
26.07.2006, 16:49
    #33880293
обновление данных в многопользовательском Веб-приложении
Можно конечно делать запрос навроде этого
if exists(select 1 from table2 where значение_первичного_ключа = ?)
update
table1
set (field1, внешнего_ключ)
values('значение', 'значение_внешеного ключа')

но есть ли другие альтернативы?
...
Рейтинг: 0 / 0
26.07.2006, 16:52
    #33880306
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обновление данных в многопользовательском Веб-приложении
а где проблема то? исключение? так можно (нужно) сообщить юзеру об этом...
...
Рейтинг: 0 / 0
26.07.2006, 17:06
    #33880352
обновление данных в многопользовательском Веб-приложении
Проблема как раз в исключении.
Исключение может быть возбуждено нарушением констрайнта, недоступностью таблицы, неккоректными параметрами.
При таком подходе надо анализировать код ошибки sqlException-а, а хочется универсальный метод и без гемороя. :-)
как в предыдущем мессадже if exists.......(там мы возможно получим что у нас обновилось 0 записей и можем делать на основании этого выводы, что не все гладко.
...
Рейтинг: 0 / 0
26.07.2006, 17:26
    #33880420
Kachalov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обновление данных в многопользовательском Веб-приложении
А транзакции не помогают?
...
Рейтинг: 0 / 0
26.07.2006, 17:31
    #33880436
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обновление данных в многопользовательском Веб-приложении
Крошкин ДимонПроблема как раз в исключении.
Исключение может быть возбуждено нарушением констрайнта, недоступностью таблицы, неккоректными параметрами.
При таком подходе надо анализировать код ошибки sqlException-а, а хочется универсальный метод и без гемороя. :-)
как в предыдущем мессадже if exists.......(там мы возможно получим что у нас обновилось 0 записей и можем делать на основании этого выводы, что не все гладко.
на основании вашего примера вы не можете делать вывод. (надо объяснять почему?)
на основании исключения вы можете делать вывод.
разницу чувствуете?
...
Рейтинг: 0 / 0
26.07.2006, 18:18
    #33880594
обновление данных в многопользовательском Веб-приложении
Timmна основании вашего примера вы не можете делать вывод. (надо объяснять почему?)
на основании исключения вы можете делать вывод.
разницу чувствуете?
Разницы не вижу. Объясните в чем она? (Ведь для каждого запроса тогда придется писать свою кастомную обработку?)

Больше склоняюсь уже к варианту с транзакциями.
...
Рейтинг: 0 / 0
26.07.2006, 21:19
    #33880836
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обновление данных в многопользовательском Веб-приложении
Вы говорите о перпендикулярных вещах...

ваш пример:
1) проверяете наличие записи
2) делаете апдейт.
между 1 и 2 в общем случае может пройти сколько угодно времени, поэтому ваш вариант не обеспечивает требования "не получать исключение".
Правильное решение должно делать п.1 во втором пункте. Если юзера не информировать, сколько чего было обновлено, то это решение вида "нам по.уй на юзера". Если информировать - то жить можно.
Но мне такой подход не нравится.
...
Рейтинг: 0 / 0
26.07.2006, 21:27
    #33880843
обновление данных в многопользовательском Веб-приложении
TimmВы говорите о перпендикулярных вещах...

ваш пример:
1) проверяете наличие записи
2) делаете апдейт.
между 1 и 2 в общем случае может пройти сколько угодно времени, поэтому ваш вариант не обеспечивает требования "не получать исключение".
Правильное решение должно делать п.1 во втором пункте. Если юзера не информировать, сколько чего было обновлено, то это решение вида "нам по.уй на юзера". Если информировать - то жить можно.
Но мне такой подход не нравится.

Небольшое возражение - в моем примере между 1 и 2 нет сколько угодно времени. Это делается в рамках одной sql операции. А так с вами согласен - на юзера нельзя класть :-)

Спасибо всем кто откликнулся.
...
Рейтинг: 0 / 0
26.07.2006, 23:10
    #33880910
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обновление данных в многопользовательском Веб-приложении
Крошкин Димон

Небольшое возражение - в моем примере между 1 и 2 нет сколько угодно времени. Это делается в рамках одной sql операции.

У вас if и update являются одной sql операцией?
...
Рейтинг: 0 / 0
27.07.2006, 01:09
    #33880982
OU
OU
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обновление данных в многопользовательском Веб-приложении
2 Крошкин Димон:
Решение однозначно в использовании транзакций, они как раз для атомарных операций и созданы, все остальные подходы не верны. А генерация исключений (где, когда и как) к решению проблемы отношения не имеет.
...
Рейтинг: 0 / 0
27.07.2006, 16:15
    #33882717
обновление данных в многопользовательском Веб-приложении
pamir Крошкин Димон

Небольшое возражение - в моем примере между 1 и 2 нет сколько угодно времени. Это делается в рамках одной sql операции.

У вас if и update являются одной sql операцией?

Да, только не во всех местах.
...
Рейтинг: 0 / 0
27.07.2006, 20:42
    #33883568
ttttttt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обновление данных в многопользовательском Веб-приложении
select for update чем не подходит?
...
Рейтинг: 0 / 0
28.07.2006, 11:57
    #33884677
обновление данных в многопользовательском Веб-приложении
tttttttselect for update чем не подходит?
А пример можно? Как этот sql query выглядит? (ни разу не встречал)
...
Рейтинг: 0 / 0
29.07.2006, 00:16
    #33886592
Sherst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обновление данных в многопользовательском Веб-приложении
Код: plaintext
1.
2.
3.
SELECT employee_id, salary FROM employees
      WHERE job_id = 'SA_REP' AND commission_pct >  10 
      FOR UPDATE

Знаю точно, что поддерживается сервером Oracle, на счет остальных серверов
не уверен.
...
Рейтинг: 0 / 0
29.07.2006, 08:30
    #33886697
обновление данных в многопользовательском Веб-приложении
Sherst
Код: plaintext
1.
2.
3.
SELECT employee_id, salary FROM employees
      WHERE job_id = 'SA_REP' AND commission_pct >  10 
      FOR UPDATE

Знаю точно, что поддерживается сервером Oracle, на счет остальных серверов
не уверен.

К сожалению разработка ведется под SQL Server. Но запросик интересный - у меня возникло несколько вопросов: когда в нем происходит обновление? либо это должен следовать второй запрос, либо данный запрос должен выполняться в рамках транзакции, или я уже ничего не понимаю )))
...
Рейтинг: 0 / 0
31.07.2006, 19:22
    #33890246
Sherst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обновление данных в многопользовательском Веб-приложении
Все выполняется в одной транзакции.
При выполнении данный запрос блокирует записи, и сможет их разблокировать только после сохранения либо отката изменений (commit / rollback)
Соответсвтенно все изменения будут видны после команд (commit / rollback)
...
Рейтинг: 0 / 0
01.08.2006, 11:16
    #33891231
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обновление данных в многопользовательском Веб-приложении
Sherst
Код: plaintext
1.
2.
3.
SELECT employee_id, salary FROM employees
      WHERE job_id = 'SA_REP' AND commission_pct >  10 
      FOR UPDATE

Знаю точно, что поддерживается сервером Oracle, на счет остальных серверов
не уверен.
Это все нормальные сервера поддерживают только вот назначение у этой штуки другое - а именно показывать серверу что данное множество записей которое мы сейчас читаем будет изменено далее в ЭТОЙ ЖЕ транзакции. Реализация же с помощью for update пессимистической блокировки - обычно слишком дорогое решение.

авторКрошкин Димон

Сделайте общий обработчик для SQLException'ов отображащий сообщение об ошибке в понятном пользователю формате.
...
Рейтинг: 0 / 0
01.08.2006, 11:19
    #33891245
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обновление данных в многопользовательском Веб-приложении
funikovyuri Sherst
Код: plaintext
1.
2.
3.
SELECT employee_id, salary FROM employees
      WHERE job_id = 'SA_REP' AND commission_pct >  10 
      FOR UPDATE

Знаю точно, что поддерживается сервером Oracle, на счет остальных серверов
не уверен.
Это все нормальные сервера поддерживают только вот назначение у этой штуки другое - а именно показывать серверу что данное множество записей которое мы сейчас читаем будет изменено далее в ЭТОЙ ЖЕ транзакции. Реализация же с помощью for update пессимистической блокировки - обычно слишком дорогое решение.

авторКрошкин Димон

Сделайте общий обработчик для SQLException'ов отображащий сообщение об ошибке в понятном пользователю формате.
? пример в студию.
...
Рейтинг: 0 / 0
01.08.2006, 14:20
    #33891981
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обновление данных в многопользовательском Веб-приложении
Timm
? пример в студию.

Чего пример? Может еще сплясать?
...
Рейтинг: 0 / 0
01.08.2006, 14:54
    #33892127
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обновление данных в многопользовательском Веб-приложении
funikovyuri Timm
? пример в студию.

Чего пример? Может еще сплясать?
если хотите.
пример когда select for update является дорогим решением. вы же говорите обычно это так, значит с примерами это подтверждающими проблем быть не должно.
...
Рейтинг: 0 / 0
01.08.2006, 15:19
    #33892260
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обновление данных в многопользовательском Веб-приложении
Timm funikovyuri Timm
? пример в студию.

Чего пример? Может еще сплясать?
если хотите.
пример когда select for update является дорогим решением. вы же говорите обычно это так, значит с примерами это подтверждающими проблем быть не должно.
Моя мысль сводится к тому что внесение взаимодействия с пользователем внуть транзакции дороже (в смысле как времени выполнения так и ресурсов), чем оптимистическая блокировка. Вы с этим не согласны?
...
Рейтинг: 0 / 0
01.08.2006, 15:39
    #33892346
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обновление данных в многопользовательском Веб-приложении
funikovyuri Timm funikovyuri Timm
? пример в студию.

Чего пример? Может еще сплясать?
если хотите.
пример когда select for update является дорогим решением. вы же говорите обычно это так, значит с примерами это подтверждающими проблем быть не должно.
Моя мысль сводится к тому что внесение взаимодействия с пользователем внуть транзакции дороже (в смысле как времени выполнения так и ресурсов), чем оптимистическая блокировка. Вы с этим не согласны?
не понял что имеется ввиду в начале фразы. говорите попроще.
я так понял: пессимистичное блокирование дороже чем оптимистичное. оно?
вот это я хотел прояснить: что значит "дороже", в чем выражается и почему.
...
Рейтинг: 0 / 0
01.08.2006, 16:09
    #33892484
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обновление данных в многопользовательском Веб-приложении
Timm
не понял что имеется ввиду в начале фразы. говорите попроще.

Слушайте, Timm, я вам чем-то обязан, или у вас вообще ко всем притензии такие?

Timm
я так понял: пессимистичное блокирование дороже чем оптимистичное. оно?
вот это я хотел прояснить: что значит "дороже", в чем выражается и почему.


Я написал в чем и что значит "дороже", вроде по-русски. Именно дороже, а не удобнее. Почему, ну хотябы потому что на поддержание такой блокировки тратяться ресурсы как сервера (что может быть очень плохо) так и клиента (что менее важно). Обычно с этим не спорят. У pessimistic locking есть много фанатов, особенно из тех специалистов кто привык писать внутренние клиент-серверные приложения. Я с этим и не спорю, говорю лишь что она дороже. Из-за этого, например, для web-приложений с большим числом пользователей pessimistic locking неприемлема в принципе.
...
Рейтинг: 0 / 0
01.08.2006, 16:30
    #33892549
Timm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обновление данных в многопользовательском Веб-приложении
funikovyuri Timm
не понял что имеется ввиду в начале фразы. говорите попроще.

Слушайте, Timm, я вам чем-то обязан, или у вас вообще ко всем притензии такие?

Timm
я так понял: пессимистичное блокирование дороже чем оптимистичное. оно?
вот это я хотел прояснить: что значит "дороже", в чем выражается и почему.


Я написал в чем и что значит "дороже", вроде по-русски. Именно дороже, а не удобнее. Почему, ну хотябы потому что на поддержание такой блокировки тратяться ресурсы как сервера (что может быть очень плохо) так и клиента (что менее важно). Обычно с этим не спорят. У pessimistic locking есть много фанатов, особенно из тех специалистов кто привык писать внутренние клиент-серверные приложения. Я с этим и не спорю, говорю лишь что она дороже. Из-за этого, например, для web-приложений с большим числом пользователей pessimistic locking неприемлема в принципе.
1. никто ничего никому не обязан. идет обычная дискуссия, которую я хочу повернуть в русло конкретики.
2. я пытаюсь выяснить простые вещи: почему вы считаете что пессимистичное блокирование дороже? в чем это выражается? какие ресурсы тратятся? хочу узнать конкретику, не слушая общие слова (их везде полно).
3. ваши доводы сводятся к "обычно с этим не спорят". я не спорю. хочу узнать почему (сорри за повторение, но может хотя бы так станет понятно че я ваще тут делаю) и увидеть примеры.
PS. может мы вообще про разные вещи говорим? здесь я под "пессимистичным блокированием" имею ввиду обычное оптимистичное с предварительной проверкой (select for update nowait) непосредственно перед обновлением данных.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / обновление данных в многопользовательском Веб-приложении / 25 сообщений из 39, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]