Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> блокировка записи бд, как заблокировать отдельную запись бд 
:(
    Опции темы
hexcom
Дата 3.6.2010, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 14.4.2010

Репутация: нет
Всего: нет



Здравствуйте. Пишу приложение для работы с бд firebird. Пользователей предпологается около 200. И тут появилась проблема с блокировкой редактируемой записи. Т.е. пользователь №1 редактирует запись, в это время пользователь №2 начинает тоже эту запись редактировать. По правильному должно выходить предупреждение что запись редактируется или режим только чтение. Как такое можно сделать? Работа производится на прямую с базой. Конкретного решения не прошу, просто пните меня в нужную сторону. 

ПС про оптимистичные и пессиместичные блокировки читал, как это реализованно в яве толком инфы не нашёл. 
ППС проект уже почти дописан и не желательно что-либо менять в базе.
PM MAIL   Вверх
carper
Дата 3.6.2010, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 2
Всего: 8



Блокировки как бы реализуются на уровне базы, типа select for update, все, что выше может только делать их вызов более или менее прозрачным для пользователя.

Но вы-то блокировки не хотите, даже оптимистической, если я правильно понял, то вы не будете проверять не изменил ли кто другой запись уже на этапе внесения измененной записи в базу, а хотите сразу как-то узнать не взял ли "себе" кто другой эту запись?!

Соответственно надо решить, как минимум, 2-е задачи:
1. Как пометить, что запись взята на редактирование
2. Как быть если кто-то запись взял и "забыл" про неё.

Добавлено через 2 минуты и 24 секунды
По обоим пунктам можно обойтись средствами СУБД, например, введя доп. поле в таблицу (помечая отобранные записи), а также запустив планировщик, который снимает "метрвые" блокировки.
Можно также для этих целей использовать единый класс-контроллер, который будет заниматься почти тем же самым, но тогда вы не сможете дать доступ к базе другим приложениям.

PM MAIL   Вверх
hexcom
Дата 3.6.2010, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 14.4.2010

Репутация: нет
Всего: нет



Блокировки я хочу, но толком не понял как их реализовать.
Дополнительное поле очень не желательно.
Работать будут несколько экземпляров программы, на разных компах.
PM MAIL   Вверх
carper
Дата 3.6.2010, 14:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 2
Всего: 8



1. Для чего вам все же нужна блокировка, т.к. в ранее описанную задачу она не вписывается?
А то получается какой-то глобальный вопрос о блокировках вообще, причем мало отношения имеющий к JAVA.

2. Вот вам вариант пессимистической блокировки, осуществляемой через JDBC - 
Код

...
ps = conn.prepareStatement("SELECT MY_FILED FROMMY_TABLE WHERE id=? FOR UPDATE NOWAIT");


3. Исходите из того, что если вы умеете устанавливать блокировку средствами SQL, то вы умеете это делать и средствами JDBC.  smile

4. Прежде чем применять пессимистические блокировки продумайте механизм их снятия. 

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

P.S.
Вы уверены, что у вас проблема не с архитектурой приложения?
Обычно должны быть бизнес-правила, при которых не возникает задачи одновременного редактирования одного и того же. Причем эти правила, хотя и реализуются программистом, но закладываются на уровне организации бизнес-процессов, возможно людьми, которые не умеют даже включать компьютер.
А для разруливания теоретической возможности "столкновения интересов" прекрасно работает оптимистическая блокировка, коя не есть физическая блокировка записей, а логическая операция, которая, в своем простейшем виде, состоит в проверке перед записью того, что кто-то другой за это время уже не изменил запись, а если так, то вас или посылает, или предлагается возможность "настоять на своем", или у начальства всплывает сообщение о том, что два барана утром рано озаботились одной и той же работой и надо бы вмешаться в сам процесс...
PM MAIL   Вверх
ivanovpv
Дата 3.6.2010, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 2
Всего: 28



Это обеспечивается стандартным механизмом транзакций СУБД. Надо делать примерно так:
Код

Connection con;
//...
con.setAutoCommit(false);
con.setTransactionIsolation(TRANSACTION_SERIALIZABLE); //самый суровый уровень изоляции транзакций
try
{
// делаем свои запросы
}
catch(Exception e)
{
   con.rollback();  // в случае неудачи откатываем транзакцию
   return;
}
con.commit(); //все хорошо, завершаем транзакцию


Придумывать новые поля и проч. не надо - все уже придумано. Погуглите со словами "JDBC transaction" или посмотрите сюда

Это сообщение отредактировал(а) ivanovpv - 3.6.2010, 15:58


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
DimW
Дата 10.6.2010, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 3
Всего: 44



hexcom, ваше желание понятно, не понятно что конкретно его вызвало.
объясните чего вы опасаетесь при одновременно редактировании записи? 
это очень важно, от этого будет зависеть решение проблемы  если проблема на самом деле существует 

Цитата(ivanovpv @  3.6.2010,  15:55 Найти цитируемый пост)
Надо делать примерно так:

для понимания:
Цитата

SERIALIZABLE. Этот уровень изоляции транзакции обычно считают наиболее ограничивающим, но он обеспечивает самую высокую степень изоляции. Транзакция с уровнем изоляции SERIALIZABLE работает в среде, где как бы нет других пользователей, модифицирующих данные в базе данных. Гарантируется, что любая прочитанная строка будет такой же при повторных чтениях, любой выполненный запрос будет возвращать одинаковые результаты в течение всего времени существования транзакции. 

Например, если вы выполните: 

select * from T;
begin dbms_lock.sleep( 60*60*24 ); end;
select * from T;

Результаты, возвращаемые из таблицы Т, будут одинаковыми и через 24 часа


ivanovpv, по вашему позиция страуса является решением проблемы? (хотя на самом деле еще неясно есть ли она)
ваш пост в данном контексте БРЕД!


PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1020 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.