|
|
|
Параллельная работа c БД в MSSQL
|
|||
|---|---|---|---|
|
#18+
Подскажите, пожалуйста. Описание: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 1. Как запретить чтение для других пользователей, если данные в этот момент используются 2. Как можно «узнать», что другой пользователь внес изменения, в те данные, которые в текущий момент открыты для просмотра другим пользователем. Большое спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 16:59:58 |
|
||
|
Параллельная работа c БД в MSSQL
|
|||
|---|---|---|---|
|
#18+
автор1. Как запретить чтение для других пользователей, если данные в этот момент используются использовать тип блокировки при открытии рекордсета adLockPessimistic автор2. Как можно «узнать», что другой пользователь внес изменения, в те данные, которые в текущий момент открыты для просмотра другим пользователем. использовать тип курсора adOpenDynamic пример rst.Open strSQL, cnnDB, adOpenDynamic, adLockPessimistic Более подробная информация в МСДН ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 17:20:10 |
|
||
|
Параллельная работа c БД в MSSQL
|
|||
|---|---|---|---|
|
#18+
К сожалению, вопросы остались. Описание проекта: 1 форма (Form1), на форме Grid (APEX True DBGrid Pro 6.0 (OLEDB)) - TDBGrid1. Для подключения к БД используется - Microsoft ActiveX Data Object 2.5 Library. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Примечание: Запрос содержит соединения не одной таблицы с различными критериями отбора. Необходимо: - Чтобы отображались изменения внесенные другими пользователями (к сожалению, использование ADODB.Recordset.CursorType=adOpenDynamic не решает эту проблему). - Как узнать перед изменением данных (началом новой транзакции), что в текущий момент эти данные используются другим пользователем (заблокированы другой транзакцией). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2005, 11:51:58 |
|
||
|
Параллельная работа c БД в MSSQL
|
|||
|---|---|---|---|
|
#18+
я не знаю ваших задач, но поверьте, использовать серверные блокировки при редактировании - одно из самых неправильных решений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2005, 12:39:40 |
|
||
|
Параллельная работа c БД в MSSQL
|
|||
|---|---|---|---|
|
#18+
подумайте над логическими блокировками - поищите по ГФ - там это не раз и не два обсуждалось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2005, 12:41:28 |
|
||
|
Параллельная работа c БД в MSSQL
|
|||
|---|---|---|---|
|
#18+
ГФ – как расшифровывается аббревиатура? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 15:21:07 |
|
||
|
Параллельная работа c БД в MSSQL
|
|||
|---|---|---|---|
|
#18+
Более подробное описание 1 форма (Form1), на форме Grid (APEX True DBGrid Pro 6.0 (OLEDB)) - TDBGrid1. Для работы с БД используется - Microsoft ActiveX Data Object 2.5 Library. Код VBA: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Хранимые процедуры: spU_LPCView: Код: plaintext 1. 2. 3. spU_LPCUpdate: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Пошаговая операцию изменения значений полей для любой записи: 1. Открывается форма, в текстовых полях которой выносятся текущие значения полей. 2. Пользователь вносит изменения, нажимает кнопку ОК 3. Новые значения полей передаются в хранимую процедуру, в которой с помощью оператора UPDATE вносятся изменения При параллельной работе с этой таблицей нескольких пользователей возникает следующая ситуация: Пользователь 1 открыл форму и вносит изменения (шаг 1), в этот промежуток времени (до того как пользователь 1 нажал на кнопку ОК) пользователь 2 вносит изменения в эту запись. После того как пользователь 1 нажал на кнопку ОК данные, внесенные пользователем 2, оказываются потерянными. Аналогичная ситуация возникает с операцией удаления. Вопрос: Как заблокировать (запретить вносить изменения) запись, которую в текущий момент изменяет пользователь 1, или же «заставить» сервер отслеживать изменения в записи с начала шага 1 и до выполнения в хранимой процедуре оператора UPDATE и в случае внесения изменений за это время запретить выполнение оператора UPDATE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2005, 15:28:22 |
|
||
|
Параллельная работа c БД в MSSQL
|
|||
|---|---|---|---|
|
#18+
Используй отсоединенные рекордсеты (adOpenStatic, adLockBatchOptimistic и set .ActiveConnection = Nothing). В этом случае при выполнении UpdateBatch, если другой пользователь уже изменил данные на сервере, выскочит ошибка о том, что данные были изменены или удалены. Отсюда возможны варианты: отменить update и оставить те данные, которые уже есть на сервере; сделать Resync и UpdateBatch - перезаписать измененную запись; или вообще вернуть все как и было на основании UndelyingValue. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2005, 11:08:24 |
|
||
|
Параллельная работа c БД в MSSQL
|
|||
|---|---|---|---|
|
#18+
Однако т.к. update делается через хранимую процедуру (не сразу заметил), мой совет не актуален. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2005, 11:10:27 |
|
||
|
Параллельная работа c БД в MSSQL
|
|||
|---|---|---|---|
|
#18+
DisputantFГФ – как расшифровывается аббревиатура? Главный Форум этого сайта - тобишь форум по MsSql ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2005, 18:38:48 |
|
||
|
Параллельная работа c БД в MSSQL
|
|||
|---|---|---|---|
|
#18+
DisputantF Вопрос: Как заблокировать (запретить вносить изменения) запись, которую в текущий момент изменяет пользователь 1, или же «заставить» сервер отслеживать изменения в записи с начала шага 1 и до выполнения в хранимой процедуре оператора UPDATE и в случае внесения изменений за это время запретить выполнение оператора UPDATE. Примерно так: перед тем как открыть запись на редактирование - пытаемся вставить в специальную таличку блокировок запись о том, что такой-то пользователь хочет редактировать вот такую запись Если на эту табличку наложить очевидный констрейнт, то такая запись не вставится - это значит, что кто-то эту запись уже редактирует. При выходе из формы редактирования - удаляем блокирующую запись в таблице блокировок. Понятно, что приложение может "слететь" до выгрузки формы, или связь оборваться - тогда запись остается блокированной навечно - надо руками лезть и удалять. С этим тоже бороться тоже весьма просто - приложение блокирует запись не навсегда, а например, на 10 секунд или минут - достаточно добавить в таблицу логических блокировок срок блокировки и дату начала блокировки. По истечении половины (или трети или двух третей или еще какой-то части) срока приложение должно продлить срок блокировки - таким образом при слете, в разумное время запись "освободится" сама. Примерно в таком ключе. Понятно, что это все работает если на сервер ходит только контролируемое Вами приложение, если-же предполагается "зоопарк", то например, можно тригерами на Update редактируемой тблицы проверять не редактируется ли эта запись другим пользователем. И предоставить всем описание процедур, которые надо вызвать чтобы получить состояние блокировок на те или иные записи. Примерно так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2005, 18:49:07 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=33219885&tid=2167243]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
| others: | 228ms |
| total: | 368ms |

| 0 / 0 |
