Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Java Базы данных (JDBC, JPA, Hibernate)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2017, 02:47   #1
Chatlaninn
 
Регистрация: 24.12.2015
Сообщений: 5
По умолчанию Вопрос по блокировке записи в базе данных

Здравствуйте, подскажите пожалуйста, как можно проверить свободна запись или заблокирована???
При редактировании записи, она должна блокироваться, это у меня происходит великолепно! Но другой пользователь в таком случае просто зависает на попытке редактировать эту же запись. А мне нужно вместо ожидания, выдавать пользователю соответствующую информацию - "запись редактируется другими, приходите завтра".
Блокировку произвожу скриптом из транзакции:

connectionUpdate.setTransactionIsol ation(Connection.TRANSACTION_READ_C OMMITTED);
stmtG = connectionUpdate.createStatement(Re sultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs = stmtG.executeQuery("select .. from... where... for update With Lock");



А дальше? Если второй клиенты пытается редактировать эту запись, то конечно подвисает в ожидании... То есть нужно перед редактированием проверять, свободна ли запись, а как проверить??? Update set x=x where id = 3 или select .. from... where id = 3 for update With Lock. Так же подвисают.
В iSQL это решается настройкой транзакции nowait, в оракле nowait можно использовать прямо в запросе, а как здесь быть?
Перерыл весь интернет, не могу найти как мне в jaybird настроить транзакцию, что бы было nowait.
Заранее благодарен.
Chatlaninn вне форума Ответить с цитированием
Старый 01.03.2017, 08:07   #2
Chatlaninn
 
Регистрация: 24.12.2015
Сообщений: 5
По умолчанию

Нашел! Заменил Connection, на FBConnection, воспользовался setTransactionParameters для установки параметров транзакции, НОО!!!
Оказывается сервер баз данных при запросе nowait на блокированную запись выдает ошибку, при этом в ResultSet, что то попадает, а что именно можно определить только next(), last() и т.д.
В результате, если все нормально, то нормально, а если сервер выдал ошибку, то есть запись заблокирована, то next(), last() зависают и никакие try не помогают... Что делать? Кто знает, подскажите пожалуйста, как отличить, что в ResultSet?
Chatlaninn вне форума Ответить с цитированием
Старый 01.03.2017, 10:51   #3
Chatlaninn
 
Регистрация: 24.12.2015
Сообщений: 5
По умолчанию

что-то совсем не так, похоже я что-то делаю не правильно, rs.next() отпускает сразу же как другой пользователь закрывает свою транзакцию... Вот код:
connectionUpdate = (FBConnection)Dst.getDBConnect();
connectionUpdate.setAutoCommit(fals e);
int [] iix = {TransactionParameterBuffer.NOWAIT, TransactionParameterBuffer.WRITE};
connectionUpdate.setTransactionPara meters(Connection.TRANSACTION_READ_ COMMITTED,iix);
try{
PrstUpd = connectionUpdate.prepareStatement(" select id from tb where id = x for update With Lock ");
boolean bl = PrstUpd.execute();
ResultSet rs = PrstUpd.getResultSet();
while(rs.next()) { В этом месте зависает, если запись уже блокирована...
А по моей логике, rs.next() должен не зависать в ожидании, а возвращать false, если запись заблокирована или саму запись, если она свободна.
Chatlaninn вне форума Ответить с цитированием
Старый 02.03.2017, 02:03   #4
Chatlaninn
 
Регистрация: 24.12.2015
Сообщений: 5
По умолчанию УРА! Получилось!

Спасибо всем! Я пробовал по разному, и executeQuery() так же не работает...
Причина оказалась в другом, может я конечно чего-то не учитываю, или слишком глупый, НО!
Код:
int [] 
iix = {TransactionParameterBuffer.NOWAIT,TransactionParameterBuffer.WRITE};
connectionUpdate.setTransactionParameters(Connection.TRANSACTION_READ_COMMITTED,iix);
Вот здесь я заполняю параметры через массив, и такой конструктор есть, параметры тасовал по разному, ничего не получалось, а потом взял и поступил иначе:
TransactionParameterBuffer tpb = null;
try {
tpb = connectionUpdate.createTransactionP arameterBuffer();
tpb.addArgument(TransactionParamete rBuffer.READ_COMMITTED);
tpb.addArgument(TransactionParamete rBuffer.WRITE);
tpb.addArgument(TransactionParamete rBuffer.REC_VERSION);
tpb.addArgument(TransactionParamete rBuffer.NOWAIT);
} catch (SQLException ex) { Logger.getLogger(mdlxx.class.getNam e()).log(Level.SEVERE, null, ex); }
try { connectionUpdate.setTransactionPara meters(tpb);
....
Удивительно, но заработало только так...
Chatlaninn вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос по базе данных obsession Общие вопросы Delphi 12 14.04.2012 20:50
Блокировка записи в базе данных на сервере Егор2 БД в Delphi 2 12.11.2010 13:51
Вопрос по базе данных AimToxa Microsoft Office Access 0 28.10.2010 23:37
PHP. Как изменить значение записи в MySQL базе данных SeRhy PHP 4 18.06.2009 12:21
EXCEL!!!Вопрос по базе данных. oblachko Microsoft Office Excel 9 24.01.2009 16:59