Какие блокировки применяются SQL Server 2005 Express? - PullRequest
0 голосов
/ 21 июня 2010

Рассмотрим веб-страницу с сеточным представлением, подключенную к SqlDataSource, имеющую все права на вставку обновления и удаления.

Публикация веб-страницы.

Это все на одном локальном компьютере

Теперь

  • открытие веб-сайта в браузере A - нажатие на редактирование вида сетки
  • открытие веб-сайта в браузере B - нажатие на редактирование вида сетки.

Теперь я редактирую в обоих браузерах и нажимаю обновить одно за другим без проблем.

Последнее обновление сохранилось.

Но гипотетическая ситуация:

  • что, если бы было два компьютера, или
  • что если бы у меня было два указателя мыши, управляемых двумя независимыми мышами

Компьютер имеет возможность запуска двух приложений одновременно

Оба пользователя готовятся и одновременно нажимают обновление в браузерах

Даже если вы рассматриваете два разных компьютера, это невозможно, но для этого вопроса

Считайте это возможным

Обновление из двух разных источников в одну и ту же базу данных в одну и ту же таблицу в одну и ту же строку

В то же время одна и та же секунда, одна и та же микросекунда без задержки, оба сервера базы данных одновременно.

Что произойдет?

Теоретически я изучил, что программное обеспечение для управления базами данных реализует блокировки при записи без чтения, без записи и т. Д., Но реализует ли SQL Server 2005 Express блокировки на практике или предполагается, что ситуация, подобная описанной выше, будетникогда не происходит?

Если блокировки там, пожалуйста, предоставьте объяснение или ресурс, который объяснил бы это с учетом различных сценариев доступа

Спасибо

edit : - Я не использую управление, как sqldatasource, поэтому, пожалуйста, когда вы предоставляете операторы, чтобы избежать обновления bling

это похоже на - algo ---

sqlconnection conn=new .....
sqlcommand
command text is "sql statement for updating values of a particular row"
conn.Open();  
cmd.ExecuteNonQuery();  
conn.close;

, чтобыВидели, как я могу определить проверку, что перед выполнением запроса, что если данные были недавно изменены, вы уверены, что хотите продолжить?или что-то в этом роде

Я немного запутался здесь, я думаю ..}

Ответы [ 2 ]

2 голосов
/ 21 июня 2010

Это решается большинством приложений, использующих Оптимистичное управление Concurency . Приложения просто добавляют дополнительные условия в условие обновления WHERE, чтобы обнаружить изменения, которые произошли между моментом считывания данных и моментом применения обновления. Называется оптимистичный параллелизм, потому что приложение предполагает, что никакие параллельные изменения не произойдут, и если они происходят, они обнаруживаются, и приложение должно перезапустить операцию. Альтернативой оптимистичной конкуренции является пессимистическая конкуренция, когда приложения явно блокируют данные, которые планируют обновить. На практике операции, включающие взаимодействие с пользователем, никогда не выполняются в рамках модели пессимистической конкуренции.

Другая модель параллелизма, особенно в распределенных приложениях, - это модель Fiefdom и Emissaries .

Таким образом, хотя блокировки баз данных и модели параллелизма транзакций всегда присутствуют в любой операции базы данных, при взаимодействии с пользователем ни одно приложение никогда не будет полагаться на блокировки базы данных. Взаимодействие с пользователем - это просто способ долго с точки зрения транзакций базы данных. Получение замков на время, пока забывчивый Фред отправляется на ланч, а на рабочем столе открыт экран данных, просто не работает.

1 голос
/ 21 июня 2010

SQL 2005 будет обеспечивать блокировки. Перед обновлением строки транзакция должна получить эксклюзивную блокировку. Одновременно может быть предоставлена ​​только 1 транзакция , поэтому другой придется подождать, пока эта транзакция будет зафиксирована ( 2 фазовая блокировка ), прежде чем будет предоставлена ​​блокировка, необходимая для Обновить.

Вторая запись «победит», поскольку она перезапишет первую. Вы можете внедрить оптимистичные элементы управления параллелизмом в sqldatasource, чтобы обнаружить, что строка изменилась, и прервать вторую, а не слепо перезаписывать первое редактирование.

Редактировать

После уточнения вопроса. Если вы хотите свернуть свой собственный, вы можете добавить в таблицу столбец timestamp (в SQL Server 2005 он обновляется автоматически при обновлении строки) и вернуть его как скрытый элемент данных в виде сетки, затем в ваш оператор UPDATE добавляет предложение where UPDATE ... WHERE PrimaryKeyColumn=@PKValue AND TimeStampCol=@OriginalTimestampValue Если строки не были затронуты (извлекаемые из ExecuteNonQuery - обычно ), тогда другая транзакция изменила строку. Это может быть немного легче, чем альтернатива, используемая элементом управления источником данных, где он возвращает исходные значения всех столбцов и добавляет их в предложение WHERE с аналогичной логикой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...