Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4380
0
Помогите пожалуйста решить задачи
24th November, 23:53
6084
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Редактирование записей базы данных несколькими пользователями
Я разработал таблицы баз данных (нормализованные, на сервере MS SQL) и создал автономный интерфейс windows для приложения, которое будет использоваться несколькими пользователями для добавления и редактирования информации. Мы добавим веб-интерфейс, который позволит осуществлять поиск по всему нашему производственному району в более поздние сроки.
Я обеспокоен тем, что если два пользователя начнут редактировать одну и ту же запись, то последним, кто зафиксирует обновление, будет 'winner', и важная информация может быть потеряна. На ум приходит множество решений, но я не уверен, что создам еще большую головную боль.
- Ничего не делайте и надейтесь, что два пользователя никогда не будут редактировать одну и ту же запись одновременно. - Может быть, никогда и не случится, но что, если это случится?
- Процедура редактирования может хранить копию исходных данных, а также обновления, а затем сравнить, когда пользователь закончил редактирование. Если они отличаются, показывают пользователя и подтверждают обновление -потребуется две копии данных для хранения.
- Добавьте последний обновленный столбец DATETIME и проверьте его соответствие при обновлении, если нет, то покажите различия. - требуется новый столбец в каждой из соответствующих таблиц.
- Создайте таблицу редактирования, которая регистрируется, когда пользователи начинают редактировать запись, которая будет проверена и не позволит другим пользователям редактировать ту же запись. - потребуется тщательное продумывание потока программ, чтобы предотвратить блокировку тупиков и записей, которые будут заблокированы, если пользователь выйдет из программы.
Есть ли какие-то лучшие решения или я должен пойти на одно из них?
Если вы ожидаете нечастых столкновений, оптимистичный параллелизм , вероятно, ваш лучший выбор.
Скотт Митчелл написал исчерпывающий учебник по реализации этого шаблона:
Реализация Оптимистичного Параллелизма
Классический подход заключается в следующем:
- добавьте в каждую таблицу логическое поле "locked".
- по умолчанию установите значение false.
когда пользователь начинает редактирование, вы делаете это:
- блокировка строки (или всей таблицы, если вы не можете заблокировать строку)
- установите флажок на строке, которую вы хотите отредактировать
- если флаг истинен то
- сообщите пользователю, что в данный момент он не может редактировать эту строку
- еще
- установите флаг в true
снять блокировку
при сохранении записи установите флаг обратно в false
@ Mark Harrison : сервер SQL не поддерживает этот синтаксис ( SELECT ... FOR UPDATE).
Эквивалентом SQL сервера является SELECT оператор hint UPDLOCK .
Дополнительную информацию смотрите в разделе SQL Server Books Online .
Другой вариант-проверить, что значения в изменяемой записи остаются теми же, что и при запуске:
SELECT
customer_nm,
customer_nm AS customer_nm_orig
FROM demo_customer
WHERE customer_id = @p_customer_id
(отобразите поле customer_nm, и пользователь изменит его)
UPDATE demo_customer
SET customer_nm = @p_customer_name_new
WHERE customer_id = @p_customer_id
AND customer_name = @p_customer_nm_old
IF @@ROWCOUNT = 0
RAISERROR( 'Update failed: Data changed' );
Вам не нужно добавлять новый столбец в таблицу (и поддерживать его в актуальном состоянии), но вам нужно создать более подробные инструкции SQL и передать новые и старые поля в хранимую процедуру.
Это также имеет то преимущество, что вы не блокируете записи - потому что все мы знаем, что записи в конечном итоге останутся заблокированными, когда их не должно быть...
Выберите для обновления и эквиваленты хороши, если вы держите блокировку в течение микроскопического количества времени, но для макроскопического количества (например, пользователь загрузил данные и не нажал 'save') вы должны использовать оптимистичный параллелизм, как описано выше. (Который я всегда считаю неправильным названием - Он более пессимистичен, чем "последний писатель выигрывает", который обычно является единственной альтернативой, рассматриваемой.)
- сначала создайте файл (время обновления) для хранения последней записи обновления -когда любой пользователь выбирает запись сохранить выбрать время, сравнить выберите время и поле время обновления, если( обновления) > (выбираете время), что значит другой пользователь обновлять эту запись После выбора записи
Со мной лучше всего работает столбец lastupdate (timetamp datatype). при выборе и обновлении просто сравните это значение еще одним преимуществом этого решения является то, что вы можете использовать этот столбец для отслеживания времени изменения данных. Я думаю, что это не очень хорошо, если вы просто создадите colum, как isLock для проверки обновления.