Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / клиент VFP9 -> SQL server 2000 / 10 сообщений из 10, страница 1 из 1
22.05.2006, 22:41
    #33743902
puls
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент VFP9 -> SQL server 2000
Здраствуюте,у меня такой вопрос,прошу совета.

Я к серверу(sql server) подключюсь и беру несколько записи,как мне блокировать эти записи у сервера пока я с ним работаю у клиента на VFP9?
Если база Foxа т.e. DBC или DBF нет проблема у FOXе для этого все есть.
Блогодарю за совет.
...
Рейтинг: 0 / 0
22.05.2006, 22:48
    #33743914
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент VFP9 -> SQL server 2000
Лучше этого не делать. Это крайне плохая стратегия работы с серверными базами данных. Пересмотри свою стратегию работы с данными.

Впрочем, если очень нужно, то ищи описание в документации к той базе данных с которой собственно и работаешь.
...
Рейтинг: 0 / 0
22.05.2006, 23:27
    #33743943
Vladimir M Sklyar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент VFP9 -> SQL server 2000
Почитай тут /topic/28238&pg=1
может натолкнет на мысли.

Я делаю так - есть 2 процедуры, одна ставит флаг, другая снимает.
При редактировании некой записи - запускаю с клиента 1ю процедуру и передаю
параметром имя таблицы и ид записи в этой таблице. Соотвествеено кто-то
другой если открывает на редактирование ту же запись - эиу таже проуедура и
говорит что запись занята.

Код: plaintext
\nCREATE  PROCEDURE [dbo].[_CheckLockRecord] @cTableName VarChar ( 20 ), \n@nRecordId INT,\n\n@nRet Int =- 1  OUTPUT\n\nAS\n\nSELECT b.* INTO #Tmp\n\nFROM sysobjects a, _REC_LOCK b, master..sysprocesses d\n\nWHERE a.name=@cTableName\n\nAND a.Id=b.Table_id\n\nAND b.Record_id=@nRecordId\n\nAND d.Spid=b.Spid AND b.spid<>@@SPID\n\nAND b.User_time = d.Login_time\n\nIF @@ROWCOUNT> 0 \n\nBEGIN\n\nSET @nRet =  0 \n\nEND\n\nELSE\n\nBEGIN\n\nBEGIN TRANSACTION\n\nDECLARE @TblId INT\n\nDECLARE @User_time DATETIME\n\nSELECT @TblId= 1234567890 \n\nSELECT @User_time = GETDATE()\n\nSELECT @TblId = (SELECT Id FROM sysobjects WHERE name=@cTableName and \nxtype=\'U\' )\n\nSELECT @User_time = (SELECT Login_time FROM master..sysprocesses WHERE \nspid=@@Spid)\n\nINSERT INTO _REC_LOCK (spid, Table_id, Record_Id, User_time)\n\nVALUES (@@SPID, @TblId, @nRecordId, @User_time)\n\nSELECT @nRet = (SELECT TOP  1  @@IDENTITY FROM _REC_LOCK)\n\n\nIF @@ERROR <>  0 \n\nBEGIN\n\nROLLBACK\n\nSET @nRet =  0 \n\nEND\n\nELSE\n\nBEGIN\n\nCOMMIT TRANSACTION\n\nEND\n\nEND\n\nDROP TABLE #Tmp\n\nSELECT @nRet AS nRet\n\n

Код: plaintext
\nCREATE  PROCEDURE [dbo].[_UnCheckLockRecord] @nRecordId INT\n\nAS\n\nDELETE FROM _REC_LOCK WHERE Id = @nRecordId\n\n


Код: plaintext
\nCREATE TABLE [dbo].[_rec_lock](\n\n[ID] [int] IDENTITY( 1 , 1 ) NOT NULL,\n\n[SPID] [int] NOT NULL,\n\n[USER_TIME] [datetime] NOT NULL,\n\n[TABLE_ID] [int] NOT NULL,\n\n[RECORD_ID] [int] NOT NULL,\n\nCONSTRAINT [PK_REC_LOCK] PRIMARY KEY CLUSTERED\n\n(\n\n[ID] ASC\n\n)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]\n\n) ON [PRIMARY]\n\n



Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
23.05.2006, 07:25
    #33744056
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент VFP9 -> SQL server 2000
pulsЗдраствуюте,у меня такой вопрос,прошу совета.

Я к серверу(sql server) подключюсь и беру несколько записи,как мне блокировать эти записи у сервера пока я с ним работаю у клиента на VFP9?
Если база Foxа т.e. DBC или DBF нет проблема у FOXе для этого все есть.
Блогодарю за совет.
Рассмотри вариант использования оптимистической блокировки с применением поля таблицы типа timestamp. Основная идея не блокировать запись полностью перед редактированием (как ты предлагаешь) и не хранить эту информацию в специальной таблице (как предлагает Vladimir M Sklyar ), а читать перед редактированием записи значение ее поля типа timestamp и проверять его перед записью. А дальше, если значения не совпадают (конфликт), решаешь что делать исходя из приоритетов пользователй, времени, бизнес - логики самого приложения и пр. Подробную информацию о таком способе можно найти на этом форуме и на форуме по SQL серверу.
С уважением, Алексей.
...
Рейтинг: 0 / 0
23.05.2006, 13:12
    #33745190
Vladimir M Sklyar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент VFP9 -> SQL server 2000
e а читать перед редактированием записи значение ее поля типа timestamp и проверять его перед записью.


Мне не подошел это вариант тем, что пользователь узнает что содержимое изменилось после кнопки "Сохранить", потому как пользователь может очень много наизменять, а при сохранении ему облом.

Вообщем, поиск по форуму SQL-сервера.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
23.05.2006, 13:37
    #33745325
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент VFP9 -> SQL server 2000
Почему сразу облом?!
Сообщить и попросить подтвердить перезаписать.
С уважением, Алексей
...
Рейтинг: 0 / 0
23.05.2006, 14:42
    #33745662
Vladimir M Sklyar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент VFP9 -> SQL server 2000
А если исходные данные уже изменились ?
Я ведь могу своими данными накрыть данные которые изменил др. пользователь которые тоже актуальны.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
23.05.2006, 15:06
    #33745798
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент VFP9 -> SQL server 2000
А если сервер не позволяет читать заблокированные данные? Это ведь не FoxPro. Пользователь заблокировал данные и ушел пить чай, а все остальные пользователи сидят и матерят того программиста. Они не погут прочиать ДРУГИЕ данные.

Ты по другому вопросы поставь:

-) Какие последствия для совместной работы будет иметь блокировка данных на неопределенно долгое время
-) Какова вероятность того, что два пользователя одновременно начнут модифицировать одни и те же данные
-) Каковы последствия того, что второй пользователь просто затрет изменения внесенные первым пользователем

Только отвечай не вообще, а применительно к твоей конкретной задаче.
...
Рейтинг: 0 / 0
23.05.2006, 15:49
    #33745998
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент VFP9 -> SQL server 2000
Vladimir M SklyarА если исходные данные уже изменились ?
Я ведь могу своими данными накрыть данные которые изменил др. пользователь которые тоже актуальны.
Posted via ActualForum NNTP Server 1.3
НЕ МОГУТ БЫТЬ АКТУАЛЬНЫМИ ОДНОВРЕМЕННО РАЗНЫЕ ДАННЫЕ В ОДНОЙ СТРОКИ!!
Мы в свое время тоже были озабочены этой проблемой, но практика показал:
1. Если пользователь меняет данные, то это ему надо.
2. Если вы не дали поменять данные ему в данный момент (блокировки, вспомогательные таблицы и пр.), то он их все равно поменяет, но позже, и изменения другого пользователя будут все равно "накрыты".
С уважением, Алексей.
...
Рейтинг: 0 / 0
23.05.2006, 16:34
    #33746205
AKI
AKI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент VFP9 -> SQL server 2000
Aleksey-K Vladimir M SklyarА если исходные данные уже изменились ?
Я ведь могу своими данными накрыть данные которые изменил др. пользователь которые тоже актуальны.
Posted via ActualForum NNTP Server 1.3
НЕ МОГУТ БЫТЬ АКТУАЛЬНЫМИ ОДНОВРЕМЕННО РАЗНЫЕ ДАННЫЕ В ОДНОЙ СТРОКИ!!
Мы в свое время тоже были озабочены этой проблемой, но практика показал:
1. Если пользователь меняет данные, то это ему надо.
2. Если вы не дали поменять данные ему в данный момент (блокировки, вспомогательные таблицы и пр.), то он их все равно поменяет, но позже, и изменения другого пользователя будут все равно "накрыты".
С уважением, Алексей.

Кто последний исправил - на того и бочку катить....
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / клиент VFP9 -> SQL server 2000 / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]