|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
01.03.2017, 02:47 | #1 |
Регистрация: 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. Заранее благодарен. |
01.03.2017, 08:07 | #2 |
Регистрация: 24.12.2015
Сообщений: 5
|
Нашел! Заменил Connection, на FBConnection, воспользовался setTransactionParameters для установки параметров транзакции, НОО!!!
Оказывается сервер баз данных при запросе nowait на блокированную запись выдает ошибку, при этом в ResultSet, что то попадает, а что именно можно определить только next(), last() и т.д. В результате, если все нормально, то нормально, а если сервер выдал ошибку, то есть запись заблокирована, то next(), last() зависают и никакие try не помогают... Что делать? Кто знает, подскажите пожалуйста, как отличить, что в ResultSet? |
01.03.2017, 10:51 | #3 |
Регистрация: 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, если запись заблокирована или саму запись, если она свободна. |
02.03.2017, 02:03 | #4 |
Регистрация: 24.12.2015
Сообщений: 5
|
УРА! Получилось!
Спасибо всем! Я пробовал по разному, и executeQuery() так же не работает...
Причина оказалась в другом, может я конечно чего-то не учитываю, или слишком глупый, НО! Код:
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); .... Удивительно, но заработало только так... |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
вопрос по базе данных | 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 |