2013-07-23 2 views
0

Я хочу реализовать блокировку строк для редактирования JQGrid. Поскольку мой конец использует JDBC, я думаю об использовании оптимистической блокировки на задней панели, и если блокировка не получена, то отображается сообщение об ошибке в сетке.Блокировка строк в jQGrid Редактировать

Это лучший способ сделать это или есть лучшая альтернатива? Можно ли заблокировать строку в самой сетке, чтобы никто другой пользователь (в другой системе и браузере) не мог редактировать определенную строку во время ее редактирования?

Пожалуйста, помогите.

Thanks

ответ

1

Я не разработчик JDBC. Есть несколько общих принципов, как можно реализовать контроль параллелизма. Один из способов - optimistic concurrency control. Существует много примеров реализации такого параллелизма.

Поскольку я работаю в основном с Microsoft SQL Server, я всегда использую двоичное значение временной метки, сохраненное в каждой строке таблиц базы данных. Я добавляю в каждую таблицу столбец типа non-nulable rowversion, который семантически эквивалентен типу binary(8). Главное преимущество заключается в том, что не нужно заполнять столбец вручную. SQL Server содержит счетчик, связанный с базой данных. При каждом обновлении строки или строки в любой таблице базы данных столбец, имеющий rowversion, будет присвоен текущему значению счетчика. После этого счетчик будет увеличен. В способе «timestemp» строки. Если какая-то модификация происходит с рядом строк, то в столбце, имеющем rowversion, увеличивается значение. Поэтому для реализации оптимистичного параллелизма нужно просто расширить каждую таблицу jqGrid с помощью дополнительного скрытого столбца, который содержит значение rowversion. Если нужно изменить данные, я посылаю на сервер значение скрытого столбца rowversion вместе с измененными данными. Запрос на изменение должен интерпретироваться следующим образом: я получаю данные со значением rowversion и модифицировал его на новое значение. Мой код сервера должен подтвердить перед внесением изменений, соответствует ли содержание данных в базе данных тому же значению rowversion. Если это так, тогда данные не будут изменены другим пользователем, и вы можете с уверенностью сделать это. Если значение rowversion теперь выше, то сервер должен вернуться к сообщению об ошибке ошибки jqGrid. Рекомендуется перезагрузить сетку с текущими данными.

Для получения дополнительной информации об осуществлении вы можете прочитать the answer и this old one.

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

+0

спасибо большое oleg! но если я правильно понимаю, это будет работать следующим образом: пользователь 1 начинает редактирование строки. В то же время пользователь 2 начинает обновлять одну и ту же строку, но когда пользователь 2 попадает в сообщение, будет отображаться сообщение об ошибке. Что делать, если сообщение об ошибке отображается перед тем, как пользователь 2 начнет вносить какие-либо изменения? Я хочу, чтобы предупреждение отображалось, как только пользователь нажимает кнопку редактирования на панели навигации. – AbtPst

+0

@ user2334092: Нет, он работает следующим образом: * a) пользователь 1 ** загружает данные ** в сетку. Данные в сетке остаются в веб-браузере. б) Позже пользователь 2 загружает и изменяет данные на своем компьютере. c) пользователь 1 начинает изменять данные в своем веб-браузере и пытается сохранить изменения. * Я знаю, что пользователи хранят много вкладок в браузерах, открытых (я тоже это делаю). Поэтому я вижу относительно старые данные на вкладках. Если я начну редактировать данные, я не всегда перезагружаю данные перед началом редактирования. Таким образом, описанная ситуация действительно важна и ее можно очень легко воспроизвести. – Oleg

+0

, но как пользователь 2 знает, что кто-то еще вносит изменения? – AbtPst

Смежные вопросы