2014-12-05 3 views
0

Я собираюсь создать приложение с использованием базы данных, где нескольким пользователям разрешено редактировать информацию об объекте.(мой) SQL Row Lock во время ввода данных C#

tldr: Как заблокировать строку в базе данных, когда пользователь редактирует ее информацию на C#.

Я провел некоторое исследование по блокировке записи в базе данных во время выполнения запроса. В основном я вижу блокировку с begin transaction и commit transaction. Однако это не устраивает мои потребности, потому что он должен быть заблокирован дольше, чем время выполнения запроса.

Если пользователь1 редактирует запись (в C#, с приложением формы, заполняя некоторые текстовые поля), тогда мне нужно, чтобы эта строка была заблокирована до тех пор, пока он не закончит редактирование. Потому что в то же время пользователь2 может попытаться отредактировать одну и ту же запись. К тому времени, когда пользователь1 будет выполнен, все будет хорошо, но когда пользователь2 закончит, он перезаписывает или получает ошибки в записи (имя), которое он искал, больше не существует.

Простым решением было бы добавить столбец с IsLocked, в зависимости от того, что пользователь может редактировать строку. Но когда по какой-то причине приложение сбой или пользовательская сила останавливает процесс в диспетчере задач, строка будет заблокирована навсегда. (или есть еще способ выполнить код, пока это происходит?)

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

сторона примечание: название говорит (мой) sql, потому что я не совсем уверен, какой из них я буду использовать.

Thx для вашего времени!

ответ

1

Я не думаю, что это лучшее решение для блокировки строки, когда пользователь редактирует данные в виде своего графического интерфейса. Приложение может произойти сбой или пользователь может редактировать грести в течение длительного времени ... Это deffinitely не зависит от SQL двигателя вы будете использовать (MS SQL, MySQL ...)

  • записи должны иметь уникальный идентификатор. Таким образом, запрос, такой как UPDATE table SET ..... WHERE entityID = someID, не будет зависеть от предыдущих значений (только знать о возможном удалении строки).

  • Вы можете запомнить значения перед редактированием (или некоторой временной отметкой, которая является частью записи базы данных), и проверить ее перед обновлением строки, чтобы вы узнает, что кто-то изменил ту же запись, и вы можете уведомить пользователя.

Что касается "держать соединение открытым" - DBConnection реализует IDisposable, прочитать this пост, как его использовать. Вам не обязательно знать об открытии соединения еще раз - прочитайте о SQL Connection Pooling.